使用IServiceProvider获取会话服务

本文关键字:服务 会话 获取 IServiceProvider 使用 | 更新日期: 2023-09-27 18:07:20

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

我有一个用委托/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();
}

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

使用IServiceProvider获取会话服务

Microsoft.AspNetCore.Session.DistributedSession实现了ISession,但ISession没有注册到DI系统,所以不能直接解析。

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

您需要用

注册IHttpContextAccessor
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

并解决这个问题,然后访问它的HttpContext.Session属性。你必须注册,因为自RC2以来,IHttpContextAccessor默认不再注册,正如GitHub问题跟踪器上的这个公告中提到的那样。