使用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方法提供什么类型来获得将查找会话的服务
Microsoft.AspNetCore.Session.DistributedSession
实现了ISession
,但ISession
没有注册到DI系统,所以不能直接解析。
但是,正如您在这里看到的,ISession
是在Session中间件执行期间创建的,并放入功能列表中(中间件可以在此列表中放入请求期间稍后可以使用的数据)。HttpContext.Session
属性是从会话中间件调用期间设置的ISessionFeature
填充的。所以你可以从HttpContext
访问它。
您需要用
注册IHttpContextAccessor
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
并解决这个问题,然后访问它的HttpContext.Session
属性。你必须注册,因为自RC2以来,IHttpContextAccessor
默认不再注册,正如GitHub问题跟踪器上的这个公告中提到的那样。