加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

使用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中所述.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读