C# ASP.NET MVC 5+;Owin&x2B;简单喷射器

C# ASP.NET MVC 5+;Owin&x2B;简单喷射器,c#,asp.net-mvc,dependency-injection,owin,simple-injector,C#,Asp.net Mvc,Dependency Injection,Owin,Simple Injector,如果我从项目中删除DI库,那么使用owin、webapi、mvc和DI(SimpleInjector)的新asp.net mvc项目运行良好。然而,一旦引入,当为DI注册OWIN组件时,应用程序就会崩溃。OWIN启动配置正在命中并正常运行,但在注册依赖项(如下所列)时,我收到以下错误: Microsoft.Owin.Host.SystemWeb.dll中发生“System.InvalidOperationException”类型的异常,但未在用户代码中处理 其他信息:在上下文中未找到owin.E

如果我从项目中删除DI库,那么使用owin、webapi、mvc和DI(SimpleInjector)的新asp.net mvc项目运行良好。然而,一旦引入,当为DI注册OWIN组件时,应用程序就会崩溃。OWIN启动配置正在命中并正常运行,但在注册依赖项(如下所列)时,我收到以下错误:

Microsoft.Owin.Host.SystemWeb.dll中发生“System.InvalidOperationException”类型的异常,但未在用户代码中处理

其他信息:在上下文中未找到owin.Environment项

SimpleInjector注册码:

container.RegisterPerWebRequest<IUserStore<ApplicationUser>>(() => new UserStore<ApplicationUser>());
container.RegisterPerWebRequest<HttpContextBase>(() => new HttpContextWrapper(HttpContext.Current));
// app fails on call to line below...
container.RegisterPerWebRequest(() => container.GetInstance<HttpContextBase>().GetOwinContext());
container.RegisterPerWebRequest(() => container.GetInstance<IOwinContext>().Authentication);
container.RegisterPerWebRequest<DbContext, ApplicationDbContext>();
container.registerWebRequest(()=>newuserstore());
container.RegisterWebRequest(()=>newHttpContextWrapper(HttpContext.Current));
//应用程序在呼叫以下线路时失败。。。
container.RegisterWebRequest(()=>container.GetInstance().GetOwinContext());
container.registerWebRequest(()=>container.GetInstance().Authentication);
container.registerWebRequest();
更新-完整堆栈跟踪

在 System.Web.HttpContextBaseExtensions.GetOwinContext(HttpContextBase (上下文)在 WebApplication1.App\u Start.SimpleInjectorInitializer.c\u DisplayClass6.b\u 2() 在里面 b:\temp\WebApplication1\WebApplication1\App\u Start\SimpleInjectorInitializer.cs:line 41在lambda_法(闭合)在 SimpleInjector.Scope.CreateAndCacheInstance[TService,TImplementation](ScopedRegistration
2
注册)在
SimpleInjector.Scope.GetInstance[TService,TImplementation](ScopedRegistration
2 注册)在 SimpleInjector.Scope.GetInstance[TService,TImplementation](ScopedRegistration
2
注册,范围)在
SimpleInjector.Advanced.Internal.LazyScopedRegistration
2.GetInstance(范围 范围)在lambda_方法(闭合)在 SimpleInjector.InstanceProducer.GetInstance()


我认为在调用
Verify()
时会引发异常。可能在那一行,但只有在调用委托时

Simple Injector允许以任何顺序进行注册,因此不会验证注册依赖项的存在性和正确性。此验证在第一次请求实例时完成,或者可以在注册过程结束时通过调用
.Verify()
触发

我怀疑您正在注册
OwinContext
,只是因为您需要它来获取
iaAuthenticationManager

您面临的问题是,
OwinContext
仅在存在
HttpContext
时可用。在合成根目录中生成应用程序时,此上下文不可用。您需要的是一个委托,它检查应用程序的阶段并返回与此阶段匹配的组件。您可以通过将
iaauthenticationmanager
注册为:

container.RegisterPerWebRequest<IAuthenticationManager>(() => 
    AdvancedExtensions.IsVerifying(container) 
        ? new OwinContext(new Dictionary<string, object>()).Authentication 
        : HttpContext.Current.GetOwinContext().Authentication); 
container.RegisterWebRequest(()=>
AdvancedExtensions.isVerification(容器)
?新文本(新字典())。身份验证
:HttpContext.Current.GetOwinContext().Authentication);
当代码在“正常运行时阶段”运行且存在
HttpContext
时,委托将返回Owin控制的
iaAuthenticationManager

但是,在注册过程结束时进行显式调用
Verify()。因此,我们将在验证容器期间创建一个新的
OwinContext
,并从新创建的
OwinContext
返回身份验证组件。但前提是容器确实正在验证


可以阅读评论中已经提到的完整和详细的描述。

尽管问题不同,但答案与前面的相同

问题在于,您正在将HttpContextWrapper注入应用程序中,并试图在应用程序初始化期间使用其成员,但在应用程序生命周期的那个时刻,HttpContext还不可用。HttpContext包含运行时状态,在一个特定用户的上下文中初始化应用程序没有意义

为了解决这个问题,您应该在运行时(当HttpContext可用时)而不是在应用程序初始化时使用一个或多个来访问它,并使用DI将工厂注入到您的服务中


使用Ric.Net的答案也可能有效,但每次初始化应用程序时都会引发异常。

Ric.Net的答案为我指明了正确的方向,但要允许更改新的SimpleInjector,必须按如下所示更改代码(注意RegisterWebRequest):

container.Register(()=>AdvancedExtensions.isVerification(容器)
?新文本(新字典())。身份验证
:HttpContext.Current.GetOwinContext().Authentication,Lifestyle.Scoped);
此外,必须向容器添加以下两个注册,以允许“container.Verify()”正常工作:

        container.Register<ApplicationUserManager>(Lifestyle.Scoped);
        container.Register<ApplicationSignInManager>(Lifestyle.Scoped);
container.Register(lifesture.Scoped);
容器。寄存器(生活方式。范围);

您可以发布完整堆栈跟踪吗?它是否在
容器点失败。验证()
?它在依赖项注册期间失败。这是一行:container.registerWebRequest(()=>container.GetInstance().Authentication);你看到了吗?我认为没有必要注册IOwinContext。您在哪里依赖要注入到另一个类中的文本。如果可能,避免直接注入文本。如果你真的需要它,可以注入一个工厂类。每次初始化应用程序时抛出异常有什么问题?初始化只会发生一次。错误。应用程序每隔一天初始化一次
        container.Register<ApplicationUserManager>(Lifestyle.Scoped);
        container.Register<ApplicationSignInManager>(Lifestyle.Scoped);