如何访问类库.Net Core 5中的会话

aaa*_*nme 1 asp.net-core-mvc .net-core asp.net-core

有没有办法访问HttpContext.session类库?(我使用 .Net Core 5)我已经完成configuration所有设置并使用microsoft.AspNetCore.Http,但我仍然无法访问会话变量。如果无法做到这一点,执行需要当前用户 ID/身份的操作的最佳方法是什么?

Mic*_*ang 8

正如@King King 回答的那样,您可以将其注入IHttpContextAccessor到班级中。

步骤1 添加Session服务

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllersWithViews();

        services.AddSession();
        services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); 

    }
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)

    {
        ...
        app.UseAuthorization();

        app.UseSession();

        app.UseEndpoints(endpoints =>
        ...
    }
Run Code Online (Sandbox Code Playgroud)

步骤2 在自定义类中访问Session

public class SessionTest
{
    private readonly IHttpContextAccessor _httpContextAccessor;
    private ISession _session => _httpContextAccessor.HttpContext.Session;

    public SessionTest(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    public void setSession()
    {
        _session.SetString("Test", "Hello World!");
    }

    public void getSession()
    {
        var message = _session.GetString("Test");
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

步骤3 通过自定义类访问会话

public class HomeController : Controller
{
    private readonly ILogger<HomeController> _logger;
    private readonly IHttpContextAccessor _httpContextAccessor;
    private readonly ISession _session;

    public HomeController(IHttpContextAccessor httpContextAccessor,ILogger<HomeController> logger)
    {
        _logger = logger;
        _httpContextAccessor = httpContextAccessor;
        _session = _httpContextAccessor.HttpContext.Session;
    }

    public IActionResult Index()
    {
        SessionTest session = new SessionTest(_httpContextAccessor);
        session.setSession();
        session.getSession();
        return View();
    }
}
Run Code Online (Sandbox Code Playgroud)