2017-03-27 30 views
1

使用OWIN和AutoFac作为IoC容器,我试图使用依赖注入将HttpContext注入会话状态存储机制,但HttpContext.Session为null。另外,我不确定它是否重要,但是我试图将HttpContextWrapper(HttpContext.Current)注入到的类是作为nuget包构建的外部dll。使用依赖注入HttpContext会话为空

Autofac注册,注册我的Autofac模块

public static void Register(IAppBuilder app) 
    { 
      var builder = new ContainerBuilder(); 
      builder.RegisterControllers(Assembly.GetExecutingAssembly()); 
      builder.RegisterModelBinderProvider(); 
      builder.RegisterFilterProvider(); 

      builder.RegisterModule(new GatewayModule()); 

      var container = builder.Build(); 
      DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 
      app.UseAutofacMiddleware(container); 
    } 

而对于autofac模块的代码:

public class GatewayModule : Module 
{ 
    protected override void Load(ContainerBuilder builder) 
    { 
     builder.RegisterType<SessionStateTokenStore>() 
      .WithParameter(new TypedParameter(typeof(HttpContextBase), new HttpContextWrapper(HttpContext.Current))) 
      .As<ITokenStore>().InstancePerRequest(); 
    } 
} 

然而,当我看着我的SessionStateTokenStore,_httpContext.Session为空。这里是我的调试器中的观察窗口的图像。 HttpContext.Session is null

为什么HttpContext.Session为空,我该如何解决它?

回答

0

你可以让Autofac解析HttpContextBase,并且看到它解决了这个问题吗?

// HttpContext 
builder.Register(c => new HttpContextWrapper(HttpContext.Current) as HttpContextBase) 
    .As<HttpContextBase>().InstancePerLifetimeScope(); 
builder.Register(c => c.Resolve<HttpContextBase>().Request) 
    .As<HttpRequestBase>().InstancePerLifetimeScope(); 
builder.Register(c => c.Resolve<HttpContextBase>().Response) 
    .As<HttpResponseBase>().InstancePerLifetimeScope(); 
builder.Register(c => c.Resolve<HttpContextBase>().Server) 
    .As<HttpServerUtilityBase>().InstancePerLifetimeScope(); 
builder.Register(c => c.Resolve<HttpContextBase>().Session) 
    .As<HttpSessionStateBase>().InstancePerLifetimeScope(); 

builder.RegisterType<SessionStateTokenStore>() 
    .As<ITokenStore>().InstancePerRequest(); 
+0

谢谢!这工作,我曾尝试过,但是很愚蠢,仍然注册.WithParameter(新TypedParameter(typeof(HttpContextBase),新HttpContextWrapper(HttpContext.Current)))让Autofac解析HttpContextBase后。事实证明,你也可以注册AutofacWebTypesModule,它和你的建议一样,再加上一些。 – csalzsieder