.Net Core 在课堂上使用 Session

abh*_*hek 6 c# .net-core asp.net-core

我在 .Net core 中使用 Session,但是我能够在 Controller 中设置和获取 Session 数据,例如

HttpContext.Session.SetString("User", "True");
var user = HttpContext.Session.GetString("User");
Run Code Online (Sandbox Code Playgroud)

但是当我尝试在具体类中使用相同的代码时,我无法这样做。它不会在HttpContext.Session之后 显示GetStringSetString

之后不起作用

HttpContext.Session
Run Code Online (Sandbox Code Playgroud)

请帮忙谢谢

sha*_*aka 6

要访问非控制器类中的会话 -

  1. 首先在Startup.ConfigureServices中注册如下服务

      services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); 
    
    Run Code Online (Sandbox Code Playgroud)
  2. 现在,在 Startup.ConfigureServices 中注册一个要访问会话的类(例如 - SessionManager)。

      services.AddScoped<SessionManager>(); 
    
    Run Code Online (Sandbox Code Playgroud)
  3. 现在,在 SessionManager 类中,添加以下代码。

      private readonly IHttpContextAccessor _httpContextAccessor;    
      private readonly ISession _session;    
      public SessionManager(IHttpContextAccessor httpContextAccessor)    
      {    
             _httpContextAccessor = httpContextAccessor;    
             _session = _httpContextAccessor.HttpContext.Session;    
       }  
    
    Run Code Online (Sandbox Code Playgroud)

上面的代码通过依赖注入接收 IHttpContextAccessor 对象,然后将 Sessions 存储在局部变量中。


Cod*_*ter 2

这是因为HttpContext是 的成员Controller,并且在控制器之外,它是类型名称。请参阅访问 ASP.NET Core 中的当前 HttpContext如何将其注入IHttpContextAccessor到类中并从那里访问会话。

但是,通常不建议在类库中使用会话。您最好将特定传递给您的库调用。因此,您不必访问库方法中的设置,而是:

// controller code

var user = HttpContext.Session.GetString("User");
var libraryResult = _fooLibrary.Bar(user);
HttpContext.Session.SetString("UserResult", libraryResult);
Run Code Online (Sandbox Code Playgroud)