使用IServiceProvider获取会话服务

Jov*_*SFT 5 session dependency-injection asp.net-core

我需要使用IServiceProvider在ASP.NET Core 1.0中的ConfigureService方法中访问会话变量.

我有一个使用delegate/lambda表达式初始化的服务,该表达式可以从任何地方返回值.在此上下文中,此lambda表达式参数应在调用后从会话返回值.

这是示例代码:

public void ConfigureServices(IServiceCollection services)
{

     services.AddTransient<IMyService>(serviceProvider =>
            {
                return new MyService(() => {
                        var session = serviceProvider.GetServices<Microsoft.AspNetCore.Session.DistributedSession>().First();
                        return session.GetString("CompanyID");
                    }
                );
            }

      );

      // Add framework services.
      services.AddMvc();
      services.AddDistributedMemoryCache();
      services.AddSession();
}
Run Code Online (Sandbox Code Playgroud)

我的会话配置正常(我可以在控制器中获取/设置值).但是,我无法从IServiceProvider获取服务.我找不到应该为GetServices方法提供什么类型来获取将找到会话的服务.

Tse*_*eng 9

Microsoft.AspNetCore.Session.DistributedSession实现ISession,但未ISession在DI系统中注册,因此您无法直接解决它.

但正如您在此处所看到的,它ISession是在执行Session中间件期间创建的,并放入功能列表中(中间件可以放置可在请求期间稍后使用的数据的列表).在会话中间件调用期间,该HttpContext.Session属性将从ISessionFeature集合中填充.所以你可以从中访问它HttpContext.

您需要注册IHttpContextAccessor

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
Run Code Online (Sandbox Code Playgroud)

并解决此问题,然后访问它的HttpContext.Session属性.你必须做好登记,因为IHttpContextAccessor默认情况下不会因为RC2了注册,本公告所提到这里对GitHub的问题跟踪器.

  • 实际上你可以使用它的单数版本,那么你不需要在最后调用`First()`。`serviceProvider.GetService&lt;IHttpContextAccessor&gt;().‌ HttpContext.Session` (2认同)