WebApi 2,OWIN和AutoFac-更改HttpContextBase依赖项

耶乔科佩克

最近,我决定要集成测试WebApi 2应用程序。我决定将我的应用程序转换为OWIN兼容。我已经包含了所有的Nu​​Get程序包,并将其与AutoFac中间件连接起来,依此类推。

但是,当我尝试使用HttpClient示例程序的Main方法中的in测试应用程序时,出现错误:

{
  "Message":"An error has occurred.",
  "ExceptionMessage":"An error occurred when trying to create a controller of type 'DinnerListController'. Make sure that the controller has a parameterless public constructor.",
  "ExceptionType":"System.InvalidOperationException",
  "StackTrace":"   at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)\r\n   at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request)\r\n   at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()",
  "InnerException":{
    "Message":"An error has occurred.",
    "ExceptionMessage":"An exception was thrown while executing a resolve operation. See the InnerException for details. ---> Value cannot be null.\r\nParameter name: httpContext (See inner exception for details.)",
    "ExceptionType":"Autofac.Core.DependencyResolutionException",
    "StackTrace":"   at Autofac.Core.Resolving.ResolveOperation.Execute(IComponentRegistration registration, IEnumerable`1 parameters)\r\n   at Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(IComponentRegistration registration, IEnumerable`1 parameters)\r\n   at Autofac.ResolutionExtensions.TryResolveService(IComponentContext context, Service service, IEnumerable`1 parameters, Object& instance)\r\n   at Autofac.ResolutionExtensions.ResolveOptionalService(IComponentContext context, Service service, IEnumerable`1 parameters)\r\n   at Autofac.Integration.WebApi.AutofacWebApiDependencyScope.GetService(Type serviceType)\r\n   at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator)\r\n   at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)",
    "InnerException":{
      "Message":"An error has occurred.",
      "ExceptionMessage":"Value cannot be null.\r\nParameter name: httpContext",
      "ExceptionType":"System.ArgumentNullException",
      "StackTrace":"   at System.Web.HttpContextWrapper..ctor(HttpContext httpContext)\r\n   at Autofac.Integration.Mvc.AutofacWebTypesModule.<Load>b__0(IComponentContext c)\r\n   at Autofac.RegistrationExtensions.<>c__DisplayClass10`1.<Register>b__f(IComponentContext c, IEnumerable`1 p)\r\n   at Autofac.Builder.RegistrationBuilder.<>c__DisplayClass1`1.<ForDelegate>b__0(IComponentContext c, IEnumerable`1 p)\r\n   at Autofac.Core.Activators.Delegate.DelegateActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters)\r\n   at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters)\r\n   at Autofac.Core.Resolving.InstanceLookup.<Execute>b__0()\r\n   at Autofac.Core.Lifetime.LifetimeScope.GetOrCreateAndShare(Guid id, Func`1 creator)\r\n   at Autofac.Core.Resolving.InstanceLookup.Execute()\r\n   at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable`1 parameters)\r\n   at Autofac.Core.Resolving.InstanceLookup.ResolveComponent(IComponentRegistration registration, IEnumerable`1 parameters)\r\n   at Autofac.Core.Registration.ExternalRegistrySource.<>c__DisplayClass8.<RegistrationsFor>b__3(IComponentContext c, IEnumerable`1 p)\r\n   at Autofac.Core.Activators.Delegate.DelegateActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters)\r\n   at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters)\r\n   at Autofac.Core.Resolving.InstanceLookup.Execute()\r\n   at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable`1 parameters)\r\n   at Autofac.Core.Resolving.InstanceLookup.ResolveComponent(IComponentRegistration registration, IEnumerable`1 parameters)\r\n   at Autofac.Core.Activators.Reflection.AutowiringParameter.<>c__DisplayClass2.<CanSupplyValue>b__0()\r\n   at Autofac.Core.Activators.Reflection.ConstructorParameterBinding.Instantiate()\r\n   at Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters)\r\n   at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters)\r\n   at Autofac.Core.Resolving.InstanceLookup.<Execute>b__0()\r\n   at Autofac.Core.Lifetime.LifetimeScope.GetOrCreateAndShare(Guid id, Func`1 creator)\r\n   at Autofac.Core.Resolving.InstanceLookup.Execute()\r\n   at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable`1 parameters)\r\n   at Autofac.Core.Resolving.InstanceLookup.ResolveComponent(IComponentRegistration registration, IEnumerable`1 parameters)\r\n   at Autofac.Core.Registration.ExternalRegistrySource.<>c__DisplayClass8.<RegistrationsFor>b__3(IComponentContext c, IEnumerable`1 p)\r\n   at Autofac.Core.Activators.Delegate.DelegateActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters)\r\n   at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters)\r\n   at Autofac.Core.Resolving.InstanceLookup.Execute()\r\n   at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable`1 parameters)\r\n   at Autofac.Core.Resolving.InstanceLookup.ResolveComponent(IComponentRegistration registration, IEnumerable`1 parameters)\r\n   at Autofac.Core.Activators.Reflection.AutowiringParameter.<>c__DisplayClass2.<CanSupplyValue>b__0()\r\n   at Autofac.Core.Activators.Reflection.ConstructorParameterBinding.Instantiate()\r\n   at Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters)\r\n   at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters)\r\n   at Autofac.Core.Resolving.InstanceLookup.<Execute>b__0()\r\n   at Autofac.Core.Lifetime.LifetimeScope.GetOrCreateAndShare(Guid id, Func`1 creator)\r\n   at Autofac.Core.Resolving.InstanceLookup.Execute()\r\n   at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable`1 parameters)\r\n   at Autofac.Core.Resolving.InstanceLookup.ResolveComponent(IComponentRegistration registration, IEnumerable`1 parameters)\r\n   at Autofac.Core.Registration.ExternalRegistrySource.<>c__DisplayClass8.<RegistrationsFor>b__3(IComponentContext c, IEnumerable`1 p)\r\n   at Autofac.Core.Activators.Delegate.DelegateActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters)\r\n   at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters)\r\n   at Autofac.Core.Resolving.InstanceLookup.Execute()\r\n   at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable`1 parameters)\r\n   at Autofac.Core.Resolving.ResolveOperation.Execute(IComponentRegistration registration, IEnumerable`1 parameters)"
    }
  }
}

我找出了原因:我的服务依赖于HttpContextBase存储和从Cookie中提取内容:

public CookieUserService(HttpContextBase httpContext)

并且AutoFac无法初始化此类。当我尝试另一个实现时,如果没有HttpContextBase依赖,它会起作用。

所以问题是:有没有一种方法可以在使用OWIN时访问cookie,以便我可以重构服务并摆脱HttContextBase(和Web.dll)依赖关系?

耶乔科佩克

切换到OWIN时,对System.Web等的所有依赖关系都将变为无效,因为它们会将应用程序与IIS托管环境紧密结合在一起。因此,AutoFac无法插入HttpContextBase对我的服务的依赖关系,因为它不能实例化。

为了解决该问题,HttpContextBase服务应该依赖于OWIN特定的接口,而不是使用System.Web依赖项(如),该接口提供应用程序和托管环境之间的抽象。

在我的特定情况下,我将服务更改为依赖于IOwinContext,如下所示:

public OwinCookieUserService(IOwinContext owinContext)
{
    if (owinContext == null) throw new ArgumentNullException(nameof(owinContext));  
    _owinContext = owinContext;
}

添加两个附加的NuGet程序包后:

  1. 汽车制造商欧文
  2. Autofac.WebApi2.Owin

我可以在Startup类中将AutoFac和OWIN粘合在一起:

public class Startup
{
   public void Configuration(IAppBuilder appBuilder)
   {
       var httpConfiguration = new HttpConfiguration();
       ...
       AutoFacConfig.ConfigureAutoFac(httpConfiguration);
       appBuilder.UseAutofacMiddleware(AutoFacConfig.Container);
       appBuilder.UseAutofacWebApi(httpConfiguration);
       appBuilder.UseWebApi(httpConfiguration);
   }
}

在我的AutoFac映射中,我具有以下例程,用于在其中定义我的服务依赖项:

....
    builder.RegisterType<OwinCookieUserService>().AsImplementedInterfaces().InstancePerLifetimeScope();
....

基本上就是这样!我不必专门为OWIN接口和类设置映射,它可以正常工作。我希望这将对将来的某些人有所帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Autofac WebApi 2 OWIN无法正常工作

来自分类Dev

Autofac WebApi 2 OWIN无法正常工作

来自分类Dev

依赖项注入不适用于Owin自托管Web Api 2和Autofac

来自分类Dev

Autofac + WebApi。实例化InstancePerLifetimeScope依赖项的双重实例

来自分类Dev

难以将Unity依赖项注入与WebAPI和OWIN一起使用

来自分类Dev

如何使用AutoFac和OWIN进行依赖项注入?

来自分类Dev

针对WebAPI和MVC的Ninject依赖项解析

来自分类Dev

Ninject WebAPI依赖项与参数

来自分类Dev

在WebApi2项目中使用CacheOutput属性时,依赖项的解析失败

来自分类Dev

在WebApi2项目中使用CacheOutput属性时,依赖项的解析失败

来自分类Dev

DependencyResolver + Owin + WebApi2

来自分类Dev

使用OWIN OAuth的MVC 5和WebApi2

来自分类Dev

无法解决Unity和WebAPI的依赖关系

来自分类Dev

Webapi,Webhost和Owin之间的关系

来自分类Dev

具有WebApi和业务层的Autofac

来自分类Dev

使用WebApi 2临时更改身份

来自分类Dev

使用循环依赖关系和可加载列表实现WebAPI

来自分类Dev

Windows Store应用程序中的MVC5 WebApi2(OWIN)和WebAuthenticationBroker

来自分类Dev

通过RelativeSource和FindAncestor到达树以更改依赖项属性

来自分类Dev

WebForms项目调用WebApi 2项目

来自分类Dev

WebForms项目调用WebApi 2项目

来自分类Dev

带有WebAPI的Microsoft Unity依赖项注入

来自分类Dev

Autofac错误:无法加载文件或程序集“ System.Web.Http,Version = 5.2.0.0,...”,我的项目是Owin WebApi2 SelfHost

来自分类Dev

AngularJS $ http和WebApi 2

来自分类Dev

OWIN在WebAPI和MVC应用程序之间共享声明

来自分类Dev

WebApi上的AngularJS和OWIN身份验证

来自分类Dev

OWIN在WebAPI和MVC应用程序之间共享声明

来自分类Dev

Authorization roles WebAPI oauth owin

来自分类Dev

授权角色WebAPI oauth owin

Related 相关文章

  1. 1

    Autofac WebApi 2 OWIN无法正常工作

  2. 2

    Autofac WebApi 2 OWIN无法正常工作

  3. 3

    依赖项注入不适用于Owin自托管Web Api 2和Autofac

  4. 4

    Autofac + WebApi。实例化InstancePerLifetimeScope依赖项的双重实例

  5. 5

    难以将Unity依赖项注入与WebAPI和OWIN一起使用

  6. 6

    如何使用AutoFac和OWIN进行依赖项注入?

  7. 7

    针对WebAPI和MVC的Ninject依赖项解析

  8. 8

    Ninject WebAPI依赖项与参数

  9. 9

    在WebApi2项目中使用CacheOutput属性时,依赖项的解析失败

  10. 10

    在WebApi2项目中使用CacheOutput属性时,依赖项的解析失败

  11. 11

    DependencyResolver + Owin + WebApi2

  12. 12

    使用OWIN OAuth的MVC 5和WebApi2

  13. 13

    无法解决Unity和WebAPI的依赖关系

  14. 14

    Webapi,Webhost和Owin之间的关系

  15. 15

    具有WebApi和业务层的Autofac

  16. 16

    使用WebApi 2临时更改身份

  17. 17

    使用循环依赖关系和可加载列表实现WebAPI

  18. 18

    Windows Store应用程序中的MVC5 WebApi2(OWIN)和WebAuthenticationBroker

  19. 19

    通过RelativeSource和FindAncestor到达树以更改依赖项属性

  20. 20

    WebForms项目调用WebApi 2项目

  21. 21

    WebForms项目调用WebApi 2项目

  22. 22

    带有WebAPI的Microsoft Unity依赖项注入

  23. 23

    Autofac错误:无法加载文件或程序集“ System.Web.Http,Version = 5.2.0.0,...”,我的项目是Owin WebApi2 SelfHost

  24. 24

    AngularJS $ http和WebApi 2

  25. 25

    OWIN在WebAPI和MVC应用程序之间共享声明

  26. 26

    WebApi上的AngularJS和OWIN身份验证

  27. 27

    OWIN在WebAPI和MVC应用程序之间共享声明

  28. 28

    Authorization roles WebAPI oauth owin

  29. 29

    授权角色WebAPI oauth owin

热门标签

归档