使用IServiceProvider获取会话服务
发布时间:2020-12-16 07:13:25 所属栏目:asp.Net 来源:网络整理
导读:我需要使用IServiceProvider在ASP.NET Core 1.0中的ConfigureService方法中访问会话变量. 我有一个使用delegate / lambda表达式初始化的服务,该表达式可以从任何地方返回值.在此上下文中,此lambda表达式参数应在调用后从会话返回值. 这是示例代码: public v
我需要使用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(); } 我的会话配置正常(我可以在控制器中获取/设置值).但是,我无法从IServiceProvider获取服务.我找不到应该为GetServices方法提供什么类型来获取将找到会话的服务. 解决方法
Microsoft.AspNetCore.Session.DistributedSession实现了ISession,但ISession未在DI系统中注册,因此您无法直接解析它.
但正如您所见,here,ISession是在会话中间件执行期间创建的,并放入功能列表中(中间件可以放置可在请求期间使用的数据的列表). HttpContext.Session属性是在会话中间件调用期间从ISessionFeature集填充的.所以你可以从HttpContext访问它. 你需要注册IHttpContextAccessor services.AddSingleton<IHttpContextAccessor,HttpContextAccessor>(); 并解决此问题,然后访问它的HttpContext.Session属性.您必须进行注册,因为自RC2以来,IHttpContextAccessor不再默认注册,如GitHub问题跟踪器上的此公告here中所述. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
热点阅读