gpt4 book ai didi

c# - ASP.NET MVC 5 + Owin + SimpleInjector

转载 作者:行者123 更新时间:2023-11-30 18:56:28 30 4
gpt4 key购买 nike

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

An exception of type 'System.InvalidOperationException' occurred in Microsoft.Owin.Host.SystemWeb.dll but was not handled in user code

Additional information: No owin.Environment item was found in the context.

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>();

更新 - 完整堆栈跟踪

at System.Web.HttpContextBaseExtensions.GetOwinContext(HttpContextBase context) at WebApplication1.App_Start.SimpleInjectorInitializer.<>c__DisplayClass6.b__2() in b:\temp\WebApplication1\WebApplication1\App_Start\SimpleInjectorInitializer.cs:line 41 at lambda_method(Closure ) at SimpleInjector.Scope.CreateAndCacheInstance[TService,TImplementation](ScopedRegistration2
registration) at
SimpleInjector.Scope.GetInstance[TService,TImplementation](ScopedRegistration
2 registration) at SimpleInjector.Scope.GetInstance[TService,TImplementation](ScopedRegistration2
registration, Scope scope) at
SimpleInjector.Advanced.Internal.LazyScopedRegistration
2.GetInstance(Scope scope) at lambda_method(Closure ) at SimpleInjector.InstanceProducer.GetInstance()

最佳答案

我认为当您调用 Verify() 时会抛出异常。可能在那一行,但只有在调用委托(delegate)时。

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

我怀疑您注册 OwinContext 只是因为您需要它来获取 IAuthenticationManager

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

container.RegisterPerWebRequest<IAuthenticationManager>(() => 
AdvancedExtensions.IsVerifying(container)
? new OwinContext(new Dictionary<string, object>()).Authentication
: HttpContext.Current.GetOwinContext().Authentication);

当代码在“正常运行时阶段”运行并且存在 HttpContext 时,委托(delegate)将返回 Owin 控制的 IAuthenticationManager

但是当显式调用 Verify()(这是高度 advisable 要做的!)时,在注册过程结束时没有 HttpContext。因此,我们将在验证容器期间创建一个新的 OwinContext,并从这个新创建的 OwinContext 返回 Authentication 组件。但前提是容器确实在验证!

可以阅读完整详细的描述here正如评论中已经提到的那样。

关于c# - ASP.NET MVC 5 + Owin + SimpleInjector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27908388/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com