问题

如何在ASP.NET Core 2.0中存储会话状态?

答案

创建一个空项目,修改Startup类的ConfigureServices()方法,添加会话状态服务和它后台的存储服务:

public void ConfigureServices(IServiceCollection services)
{
services.AddDistributedMemoryCache();
services.AddSession();
}

在Configure()中添加会话中间件:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseSession(); app.Use(async (context, next) =>
{
context.Session.SetString("GreetingMessage", "Hello Session State");
await next();
}); app.Run(async (context) =>
{
var message = context.Session.GetString("GreetingMessage");
await context.Response.WriteAsync($"{message}");
});
}

运行,此时页面效果:

讨论

我们可以使用会话状态在同一个浏览器不同HTTP请求之间共享数据。这个数据是存储在缓存中的(也就是IDistributedCache实现),并且可以通过HttpContext.Session属性来访问。

为了关联不同的HTTP请求,一个Cookie被存储到浏览器端,它的默认名称是.AspNetCore.Session.

在配置会话状态服务时,我们可以设置各种属性:

1. HttpOnly:设置Cookie是否可以通过JavaScript访问。缺省值是true,也就是说在客户端不能通过脚本访问。

2. Name:用来覆盖缺省的Cookie名称。

3. SecurePolicy:是否只能通过HTTPS请求来传输Cookie信息。

4. IdelTimeout:设置会话的过期时间,每一个后续的请求都会重置这个时间。缺省值是20分钟。

public void ConfigureServices(IServiceCollection services)
{
services.AddDistributedMemoryCache(); services.AddSession(options => {
options.Cookie.HttpOnly = true;
options.Cookie.Name = ".Sanshi.Session";
options.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest;
options.IdleTimeout = TimeSpan.FromMinutes(10);
});
}

下面我们对比下,默认的Cookie:

配置Session的Cookie.Name属性之后:

存储对象

HttpContext.Session(实现了ISession接口)没有提供保存复杂对象的方法,然而我们可以通过序列化对象为字符串来实现这个功能:

public static class SessionExtensions
{
public static void SetObject<T>(this ISession session, string key, T value)
{
session.SetString(key, JsonConvert.SerializeObject(value));
} public static T GetObject<T>(this ISession session, string key)
{
var value = session.GetString(key);
return value == null ? default(T) : JsonConvert.DeserializeObject<T>(value);
}
}

JsonConvert是Newtonsoft.Json库的一个静态类,可以方便的在.Net类型和JSON类型之间转换,VS可以快速添加:

接下来,我们就可以使用这些扩展方法:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseSession(); app.Use(async (context, next) =>
{
context.Session.SetObject("CurrentUser",
new UserInfo { Username = "James", Email = "james@bond.com" });
await next();
}); app.Run(async (context) =>
{
var user = context.Session.GetObject<UserInfo>("CurrentUser");
await context.Response.WriteAsync($"{user.Username}, {user.Email}");
});
}  

运行,此时页面显示:

通过依赖注入访问

我们可以通过构造函数注入方式来使用会话状态(IHttpContextAccessor),然后通过这个接口来访问HttpContext属性。

源代码下载

原文:https://tahirnaushad.com/2017/08/18/asp-net-core-session-state/

[译]ASP.NET Core 2.0 会话状态的更多相关文章

  1. [译]ASP.NET Core 2.0 系列文章目录

    基础篇 [译]ASP.NET Core 2.0 中间件 [译]ASP.NET Core 2.0 带初始参数的中间件 [译]ASP.NET Core 2.0 依赖注入 [译]ASP.NET Core 2 ...

  2. [译]ASP.NET Core 2.0 中间件

    问题 如何创建一个最简单的ASP.NET Core中间件? 答案 使用VS创建一个ASP.NET Core 2.0的空项目,注意Startup.cs中的Configure()方法: public vo ...

  3. [译]ASP.NET Core 2.0 带初始参数的中间件

    问题 如何在ASP.NET Core 2.0向中间件传入初始参数? 答案 在一个空项目中,创建一个POCO(Plain Old CLR Object)来保存中间件所需的参数: public class ...

  4. [译]ASP.NET Core 2.0 全局配置项

    问题 如何在 ASP.NET Core 2.0 应用程序中读取全局配置项? 答案 首先新建一个空项目,并添加两个配置文件: 1. appsettings.json { "Section1&q ...

  5. [译]ASP.NET Core 2.0 机密配置项

    问题 如何在ASP.NET Core 2.0中保存机密配置项(不用将其暴露给源代码管理器)? 答案 创建一个ASP.NET Core 2.0空项目,在项目节点上点击右键,并点击菜单项 - 管理用户机密 ...

  6. [译]ASP.NET Core 2.0 本地文件操作

    问题 如何在ASP.NET Core 2.0中受限地访问本地目录和文件信息? 答案 新建一个空项目,修改Startup类,添加访问本地文件所需的服务: public void ConfigureSer ...

  7. [译]ASP.NET Core 2.0 网址重定向

    问题 如何在ASP.NET Core 2.0中实现网址重定向? 答案 新建一个空项目,在Startup.cs文件中,配置RewriteOptions参数并添加网址重定向中间件(UseRewriter) ...

  8. [译]ASP.NET Core 2.0 路由引擎

    问题 ASP.NET Core 2.0的路由引擎是如何工作的? 答案 创建一个空项目,为Startup类添加MVC服务和请求中间件: public void ConfigureServices(ISe ...

  9. [译]ASP.NET Core 2.0 路由引擎之网址生成

    问题 如何在ASP.NET Core 2.0中由路由引擎来生成网址? 答案 新建一个空项目,修改Startup.cs文件,添加MVC服务和中间件: public void ConfigureServi ...

随机推荐

  1. 201521123074 《Java程序设计》第9周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 Q1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自 ...

  2. Lucene第二篇【抽取工具类、索引库优化、分词器、高亮、摘要、排序、多条件搜索】

    对Lucene代码优化 我们再次看回我们上一篇快速入门写过的代码,我来截取一些有代表性的: 以下代码在把数据填充到索引库,和从索引库查询数据的时候,都出现了.是重复代码! Directory dire ...

  3. Servlet第三篇【request和response简介、response的常见应用】

    response.request对象 Tomcat收到客户端的http请求,会针对每一次请求,分别创建一个代表请求的request对象.和代表响应的response对象 既然request对象代表ht ...

  4. 浅谈Linux虚拟内存

    我的orangepi内存很少,所以我打算给它弄个虚拟内存 首先建立一个1G的空文件: dd if=/dev/zero of=/home/swapfile bs=64M count=16 格式化为swa ...

  5. git fatal: I don't handle protocol 'https'问题的解决

    问题重现 新建的仓库,再把本地的代码往上push的时候Git提示 $ fatal: I don't handle protocol 'https' 问题分析 Git是支持https的,这点毋庸置疑,所 ...

  6. Thinkphp3.2版本使用163邮箱发(验证码)邮件

    今天忽然想写一个用户修改密码的功能,又没有短信接口,只能选择用邮箱发送验证码啦,穷啊,没办法,哈哈,以下为正文. ------------------------------------------- ...

  7. BackTrack 5无线网卡混杂模式设置

    用ifconfig查看网络设备 主机无线网卡名称一般为wlan0,USB网卡一般为wlan1 虚拟机中USB网卡一般无法自动识别,可以用ifconfig wlan1 up启用 用ifconfig wl ...

  8. 再起航,我的学习笔记之JavaScript设计模式26(解释器模式)

    解释器模式 概念介绍 解释器模式(Interpreter):给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 获取元素在页面中的路径 我们都知道获取一个 ...

  9. HDFS概述(3)————HDFS Federation

    本指南概述了HDFS Federation功能以及如何配置和管理联合集群. 当前HDFS背景 HDFS主要有两层: 1.Namespace (1)包含目录,文件和块. (2)它支持所有命名空间相关的文 ...

  10. Eddy's爱好 hdu2204

    Eddy's爱好 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...