【问题标题】:HttpContext Session is null when using Dependency Injection使用依赖注入时 HttpContext Session 为空
【发布时间】:2017-03-27 18:56:08
【问题描述】:

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

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 为空,我该如何解决?

【问题讨论】:

    标签: c# asp.net session autofac httpcontext


    【解决方案1】:

    能否让 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();
    

    【讨论】:

    • 谢谢!这确实有效,我之前尝试过,但是在让 Autofac 解析 HttpContextBase 之后,我很愚蠢并且仍在注册 .WithParameter(new TypedParameter(typeof(HttpContextBase), new HttpContextWrapper(HttpContext.Current)))。原来你也可以只注册 AutofacWebTypesModule ,它做的事情和你建议的一样,再加上一点。
    猜你喜欢
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 2016-10-01
    • 2022-07-07
    • 1970-01-01
    • 2010-12-07
    • 2019-09-04
    • 2016-10-03
    相关资源
    最近更新 更多