C# 无法访问已处理的对象。\r\n对象名称:';ApplicationUserManager';

C# 无法访问已处理的对象。\r\n对象名称:';ApplicationUserManager';,c#,asp.net-web-api,asp.net-identity,owin,autofac,C#,Asp.net Web Api,Asp.net Identity,Owin,Autofac,我有一个web API,并为DI使用Autofac。 在启动方法中,我使用app.CreatePerOwinContext(AppDbContext、UserManager和SignInManager)配置auth。我还在这里配置autofac,并注册控制器和其他所需类型和模块 我还向DI注册了OwinContext,在我的API使用的一个库中,我正在进行IOwinContext 当我发出第一个API请求时,Context.GetUserManager()工作正常,但在第一个请求之后,它总是抛出

我有一个web API,并为DI使用
Autofac
。 在启动方法中,我使用app.CreatePerOwinContext(AppDbContext、UserManager和SignInManager)配置auth。我还在这里配置
autofac
,并注册控制器和其他所需类型和模块

我还向DI注册了
OwinContext
,在我的API使用的一个库中,我正在进行
IOwinContext

当我发出第一个API请求时,Context.GetUserManager()工作正常,但在第一个请求之后,它总是抛出“无法访问已处理的对象。\r\n对象名:'ApplicationUserManager'

我的控制器是使用InstancePerRequest()注册的 我的库是使用InstancePerLifetimeScope()注册的

如果我绕过API并直接调用库代码,同样的代码可以很好地用于ASP.NETWeb应用程序

我试了这么多,但我没能想出正确的解决办法

Startup.cs类(Web Api)

公共部分类启动
{
公共无效配置(IAppBuilder应用程序)
{
//添加cors中间件
应用程序UseCors(CorsOptions.AllowAll);
//http配置
var config=新的HttpConfiguration();
WebApiConfig.Register(配置);
//配置身份验证
ConfigureAuth(app);
//配置DI容器
AutofacConfig.Register(应用程序,配置);
app.UseWebApi(配置);
}
public void ConfigureAuth(IAppBuilder应用程序)
{
app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext(ApplicationUserManager.Create);
app.CreatePerOwinContext(ApplicationSignInManager.Create);
}
}
DI注册

公共类AutofacConfig
{
公共静态无效寄存器(IAppBuilder应用程序,HttpConfiguration配置)
{
var builder=new ContainerBuilder();
Register(c=>HttpContext.Current.Request.GetOwinContext()).As();
RegisterAppController(Assembly.getExecutionGassembly()).InstancePerRequest();
//这是在不同库中的另一个模块中,我在这里使用builder.RegisterModule调用它
builder.RegisterType();
//将依赖项解析程序设置为Autofac。
var container=builder.Build();
config.DependencyResolver=新的AutoFacWebApidencyResolver(容器);
//首先注册Autofac中间件,然后注册Autofac Web API中间件,
app.useautofac中间件(容器);
app.UseAutofacWebApi(配置);
}
}
这是我的用户经理

公共类用户管理器:IManager
{
专用ApplicationUserManager\u ApplicationUserManager;
私有只读IOwinContext\u上下文;
受保护的ApplicationUserManager ApplicationUserManager
{
get=>\u applicationUserManager???\u context.GetUserManager();
set=>\u applicationUserManager=value;
}
公共用户管理器(IOwinContext上下文)
{
_上下文=上下文;
ApplicationUserManager=context.GetUserManager();
}
公共用户GetById(int?id)
{
//这会在第一个API请求后引发System.ObjectDisposedException('无法访问已处置对象。对象名称:'ApplicationUserManager'。)。
var user=ApplicationUserManager.FindByEmail(entity.UserName);
返回实体;
}
}

我终于解决了这个问题。 UserManager正在由多个应用程序共享。API和ASP.Net Web应用需要使用InstancePerRequest()注册它 对于其他应用程序,我使用InstancePerLifetimeScope()注册了它

创建了一个具有构造函数参数的模块,该参数采用bool值,如果参数为true,则使用InstancePerRequest()注册UserManager,否则使用InstancePerLifetimeScope()。 这解决了我的问题

基本上就是这样发生的, 在每次请求之后,都会释放OwinContext中的ApplicationUserManager,但我的UserManager仍然与相同的OwinContext相同

公共类AutofacConfig
{
公共静态无效寄存器(IAppBuilder应用程序,HttpConfiguration配置)
{
var builder=new ContainerBuilder();
builder.Register(c=>HttpContext.Current.Request.GetOwinContext()).As().InstancePerRequest();
RegisterAppController(Assembly.getExecutionGassembly()).InstancePerRequest();
//这是在不同库中的另一个模块中,我在这里使用builder.RegisterModule调用它
builder.RegisterType().As().InstancePerRequest();
//将依赖项解析程序设置为Autofac。
var container=builder.Build();
config.DependencyResolver=新的AutoFacWebApidencyResolver(容器);
//首先注册Autofac中间件,然后注册Autofac Web API中间件,
app.useautofac中间件(容器);
app.UseAutofacWebApi(配置);
}
}

这篇文章将帮助您:,正确地插入ApplicationUserManager正如您在我的文章中所读到的,ApplicationUserManager是可用的,并且不会对API的第一个请求进行处理。它在后续请求中失败。