目录前言:1) 关于Http中的会话2) 关于 ASP.net core 中的会话一、配置会话中间件二、会话状态的读写三、 示例的生命周期四、其他前言: 本文使用 .net core
本文使用 .net core SDK 3.1 的版本。
配置基于内存的分布式缓存服务和会话服务,如需要将缓存放置于数据库可以参考微软官方文档
public void ConfigureServices(IServiceCollection services)
{
// 添加基于内存的缓存服务,以供会话中间件来使用
collection.ADDDistributedMemoryCache();
// 添加会话
collection.AddSession();
}
添加会话中间件
public void Configure(IApplicationBuilder app)
{
// 引入会话中间件
app.UseSession();
}
写入Session
ISession session = httpContext.Session;
var sessionStartTime = DateTime.Now.ToString(CultureInfo.InvariantCulture);
session.SetString("SessionStartTime", sessionStartTime);
读取Session
ISession session = httpContext.Session;
session.TryGetValue("SessionStartTime", out var value);
var sessionStartTime = Encoding.UTF8.GetString(value);
获取SessionId
ISession session = httpContext.Session;
session.TryGetValue("SessionStartTime", out var value);
var sessionStartTime = Encoding.UTF8.GetString(value);
获取SessionKey
SessionKey 需要通过反射获取
ISession session = httpContext.Session;
var field = typeof(DistributedSession).GetTypeInfo()
.GetField("_sessionKey", BindingFlags.Instance | BindingFlags.NonPublic);
var sessionKey = field?.GetValue(session);
这里准备了示例的代码:
app.UseEndpoints(endpoints =>
{
endpoints.MapGet("/get", async httpContext =>
{
ISession session = httpContext.Session;
string sessionStartTime;
if (session.TryGetValue("SessionStartTime", out var value))
{
sessionStartTime = Encoding.UTF8.GetString(value);
}
else
{
sessionStartTime = DateTime.Now.ToString(CultureInfo.InvariantCulture);
session.SetString("SessionStartTime", sessionStartTime);
}
var field = typeof(DistributedSession).GetTypeInfo()
.GetField("_sessionKey", BindingFlags.Instance | BindingFlags.NonPublic);
var sessionKey = field?.GetValue(session);
var responseText = $@"
<html>
<body>
<h1>Get Session</h1>
<ul>
<li>Session ID:{session.Id}</li>
<li>Session Key:{sessionKey}</li>
<li>Session Start Time:{sessionStartTime}</li>
<li>Current Time:{DateTime.Now:yyyy-MM-dd HH:mm:ss}</li>
</ul>
</body>
</html>";
httpContext.Response.ContentType = "text/html";
await httpContext.Response.WriteAsync(responseText);
});
});
清除浏览器中的 Cookie,然后刷新页面进入/get
页面中,可以看到在新的网络请求中响应标头多了一个 set-cookie,这个set-cookie是被加密的SessionKey,还具有 httponly 的标签,以防止Cookie 的值被跨站读取。
默认请求下 Cookie 采用的路径是根路径
然后我们重新刷新页面,可以看到请求标头中多出一个 cookie,就是之前的 set-cookie,因为之前缓存被清除以后,第一次刷新标头多一个 set-cookie,相当于创建一个新的会话,当下一次发起请求就会带上 cookie。
以上就是ASP.NET Core中间件会话状态读写及生命周期示例的详细内容,更多关于ASP.NET Core会话中间件的资料请关注编程网其它相关文章!
--结束END--
本文标题: ASP.NETCore中间件会话状态读写及生命周期示例
本文链接: https://www.lsjlt.com/news/147645.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2023-05-21
2023-05-21
2023-05-21
2023-05-21
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0