恭喜您获得阿里云幸运券 建站,有个好记的域名非常重要!
  • By xoyozo 转载请注明出处
  • Posted 2019/11/20 15:23:25

ASP.NET Core 3.0 会话状态(Session State)

Nuget 安装:

Microsoft.AspNetCore.Http.Extensions


打开文件 Startup.cs

在方法 ConfigureServices() 中添加:

services.AddSession(options =>
{
    options.IdleTimeout = TimeSpan.FromMinutes(20);
    options.Cookie.HttpOnly = true;
});

在方法 Configure() 中添加:

app.UseSession();

注意中间件的顺序


控制器中使用示例:

using Microsoft.AspNetCore.Http;

string k = "count";
int v = HttpContext.Session.GetInt32(k) ?? 0;
v++;
HttpContext.Session.SetInt32(k, v);
return Content(v.ToString());


扩展 ISession

这里,Session 只能存储 byte[]、string、int? 类型,扩展  ISession 使之支持任何类型:

public static class SessionExtensions
{
    public static void Set<T>(this ISession session, string key, T value)
    {
        session.SetString(key, JsonConvert.SerializeObject(value));
    }

    public static T Get<T>(this ISession session, string key)
    {
        var value = session.GetString(key);

        return value == null ? default : JsonConvert.DeserializeObject<T>(value);
    }
}


使用方式变成:

string k = "count";
int v = HttpContext.Session.Get<int>(k);
v++;
HttpContext.Session.Set(k, v);
return Content(v.ToString());


在控制器外(普通类中)使用:

在文件 Startup.cs 的 ConfigureServices() 方法中添加:

services.AddHttpContextAccessor();

创建一个类(以类名“_Session”为例),并配置一个 int 类型的键“Count”:

构造函数注入 IHttpContextAccessor。

public class _Session
{
    private readonly IHttpContextAccessor httpContextAccessor;
    private ISession session => httpContextAccessor.HttpContext.Session;

    public _Session(IHttpContextAccessor httpContextAccessor)
    {
        this.httpContextAccessor = httpContextAccessor;
    }

    public int Count
    {
        set { session.Set("Count", value); }
        get { return session.Get<int>("Count"); }
    }
}

在控制器中调用:

构造函数注入 IHttpContextAccessor。

public class TestController : Controller
{
    private readonly IHttpContextAccessor httpContextAccessor;

    public TestController(IHttpContextAccessor httpContextAccessor)
    {
        this.httpContextAccessor = httpContextAccessor;
    }

    public IActionResult Index()
    { 
        _Session session = new _Session(_httpContextAccessor);
        session.Count++;
        return Content(session.Count.ToString());
    }
}

缓存中的数据:

image.png


在视图页面中使用示例:

@using Microsoft.AspNetCore.Http
@inject Microsoft.AspNetCore.Http.IHttpContextAccessor  _httpContextAccessor
@{
    _Session session = new _Session(_httpContextAccessor);
}
@session.Count


* 在使用 Redis 缓存的开发过程,断点调试时 Session 写入可能会失效(可能弹出错误框),原因暂未知晓。


更详细的说明请参阅官方文档


谢谢赞赏

相关文章

大家正在看

最新发布