asp.net core session使用
一、配置回话状态
Microsoft.AspNetCore.App metapackage 中包含的 Microsoft.AspNetCore.Session 包提供中间件来管理会话状态。 若要启用会话中间件,Startup 必须包含:
- 任一 IDistributedCache 内存缓存。
IDistributedCache实现用作会话后备存储。 有关详细信息,请参阅 ASP.NET Core 中的分布式缓存。 - 对
ConfigureServices中 AddSession 的调用。 - 对
Configure中 UseSession 的调用。
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddDistributedMemoryCache(); services.AddSession(options =>
{
// Set a short timeout for easy testing.
options.IdleTimeout = TimeSpan.FromSeconds();
options.Cookie.HttpOnly = true;
// Make the session cookie essential
options.Cookie.IsEssential = true;
}); services.AddMvc()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
} public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
} app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseSession();
app.UseHttpContextItemsMiddleware();
app.UseMvc();
}
}
中间件的顺序很重要。 在前面的示例中,在 UseMvc 之后调用 UseSession 时会发生 InvalidOperationException 异常。 有关详细信息,请参阅中间件排序。
配置会话状态后,HttpContext.Session 可用。
调用 UseSession 以前无法访问 HttpContext.Session。
在应用已经开始写入到响应流之后,不能创建有新会话 Cookie 的新会话。 此异常记录在 Web 服务器日志中但不显示在浏览器中。
二、以异步方式加载会话状态
只有在 TryGetValue、Set 或 Remove 方法之前显式调用 ISession.LoadAsync 方法,ASP.NET Core 中的默认会话提供程序才会从基础 IDistributedCache 后备存储以异步方式加载会话记录。 如果未先调用 LoadAsync,则会同步加载基础会话记录,这可能对性能产生大规模影响。
若要让应用强制实施此模式,如果未在 TryGetValue、Set 或 Remove 之前调用 LoadAsync 方法,那么使用引起异常的版本包装 DistributedSessionStore 和 DistributedSession 实现。 在服务容器中注册的已包装的版本。
三、会话选项
若要替代会话默认值,请使用 SessionOptions。
| 选项 | 说明 |
|---|---|
| Cookie | 确定用于创建 Cookie 的设置。 名称默认为 SessionDefaults.CookieName (.AspNetCore.Session)。 路径默认为 SessionDefaults.CookiePath (/)。 SameSite 默认为 SameSiteMode.Lax (1)。 HttpOnly 默认为 true。 IsEssential 默认为 false。 |
| IdleTimeout | IdleTimeout 显示放弃其内容前,内容可以空闲多长时间。 每个会话访问都会重置超时。 此设置仅适用于会话内容,不适用于 Cookie。 默认为 20 分钟。 |
| IOTimeout | 允许从存储加载会话或者将其提交回存储的最大时长。 此设置可能仅适用于异步操作。 可以使用 InfiniteTimeSpan 禁用超时。 默认值为 1 分钟。 |
会话使用 Cookie 跟踪和标识来自单个浏览器的请求。 默认情况下,此 Cookie 名为 .AspNetCore.Session ,并使用路径 /。 由于 Cookie 默认值不指定域,因此它不提供页上的客户端脚本(因为 HttpOnly 默认为 true)。
若要替换 Cookie 会话默认值,请使用 SessionOptions:
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
}); services.AddDistributedMemoryCache(); services.AddMvc()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2); services.AddSession(options =>
{
options.Cookie.Name = ".AdventureWorks.Session";
options.IdleTimeout = TimeSpan.FromSeconds();
options.Cookie.IsEssential = true;
});
}
应用使用 IdleTimeout 属性确定放弃服务器缓存中的内容前,内容可以空闲多长时间。 此属性独立于 Cookie 到期时间。 通过会话中间件传递的每个请求都会重置超时。
会话状态为“非锁定” 。 如果两个请求同时尝试修改同一会话的内容,则后一个请求替代前一个请求。 Session 是作为一个连贯会话实现的,这意味着所有内容都存储在一起 。 两个请求试图修改不同的会话值时,后一个请求可能替代前一个做出的会话更改。
四、设置和获取会话值
使用 HttpContext.Session 从 Razor Pages PageModel 类或 MVC 控制器类访问会话状态。 此属性是 ISession 实现。
ISession 实现提供用于设置和检索整数和字符串值的若干扩展方法。 项目引用 Microsoft.AspNetCore.Http.Extensions 包时,扩展方法位于 Microsoft.AspNetCore.Http 命名空间中(添加 using Microsoft.AspNetCore.Http; 语句获取对扩展方法的访问权限)。 这两个包均包括在 Microsoft.AspNetCore.App 元包中。
ISession 扩展方法:
- Get(ISession, String)
- GetInt32(ISession, String)
- GetString(ISession, String)
- SetInt32(ISession, String, Int32)
- SetString(ISession, String, String)
以下示例在 Razor Pages 页中检索 IndexModel.SessionKeyName 键(示例应用中的 _Name)的会话值:
@page
@using Microsoft.AspNetCore.Http
@model IndexModel ... Name: @HttpContext.Session.GetString(IndexModel.SessionKeyName)
更多:
Asp.net Core CacheHelper 通用缓存帮助类
asp.net core session使用的更多相关文章
- IT咨询顾问:一次吐血的项目救火 java或判断优化小技巧 asp.net core Session的测试使用心得 【.NET架构】BIM软件架构02:Web管控平台后台架构 NetCore入门篇:(十一)NetCore项目读取配置文件appsettings.json 使用LINQ生成Where的SQL语句 js_jquery_创建cookie有效期问题_时区问题
IT咨询顾问:一次吐血的项目救火 年后的一个合作公司上线了一个子业务系统,对接公司内部的单点系统.我收到该公司的技术咨询:项目启动后没有规律的突然无法登录了,重新启动后,登录一断时间后又无法重新登 ...
- asp.net core session丢失问题排查
最近公司采用asp.net core的站点在外测环境中,总是发现存在session丢失的情况.排查了好久,客户端.AspNetCore.Session的cookie未丢失,session的分布式缓存采 ...
- asp.net core session的使用
Session介绍 本文假设读者已经了解Session的概念和作用,并且在传统的.net framework平台上使用过. Asp.net core 1.0好像需要单独安装,在nuget控制台,选择你 ...
- asp.net core Session的测试使用心得及注意事项
sp.net-core中Session是以中间件的形式注册使用的.不比asp.net中的使用,直接使用Session就行. 首先在.net-core框架中注入Session中间件,首先在Configu ...
- Asp.net Core Session 存储任意对象
using Microsoft.AspNetCore.Http; using Newtonsoft.Json; public static class SessionExtensions { publ ...
- ASP.NET Core 使用 Redis 和 Protobuf 进行 Session 缓存
前言 上篇博文介绍了怎么样在 asp.net core 中使用中间件,以及如何自定义中间件.项目中刚好也用到了Redis,所以本篇就介绍下怎么样在 asp.net core 中使用 Redis 进行资 ...
- ASP.NET Core 2 学习笔记(十一)Cookies & Session
基本上HTTP是没有记录状态的协定,但可以通过Cookies将Request来源区分出来,并将部分数据暂存于Cookies及Session,是写网站常用的用户数据暂存方式.本篇将介绍如何在ASP.NE ...
- asp.net core 使用 Redis 和 Protobuf
asp.net core 使用 Redis 和 Protobuf 前言 上篇博文介绍了怎么样在 asp.net core 中使用中间件,以及如何自定义中间件.项目中刚好也用到了Redis,所以本篇就介 ...
- 为什么我的会话状态在ASP.NET Core中不工作了?
原文:Why isn't my session state working in ASP.NET Core? Session state, GDPR, and non-essential cookie ...
随机推荐
- vue.js 实现粒子特效之插件( vue-particles )
首先先一张效果图 图上那些类似于星座图的点和线,是由vue-particles生成的,不仅自己动,而且能与用户鼠标事件产生互动. 使用教程: npm install vue-particles --s ...
- 生意bisynes单词bisynes商业
英语bisynes商务概念的提出是改革的产物,有一个演变的过程:贸易部--商业部.外贸部--内贸部--内贸局--商务部.是内外贸一体化的概念. 中文名:商务 外文名:Business,Bisynes商 ...
- 关于控制Broker端入站连接数的讨论
Kafka Broker端处理请求采用Reactor模型.每台Broker上有个类似于Dispatcher的Acceptor线程,还有若干个处理请求的Processor线程(当然真正处理请求逻辑的线程 ...
- Intel网卡的漫游主动性
- 控制跳转的tree视图显示的列表项数量
在act_window中,定义limit字段,可以指定打开的tree视图的记录数量. limit:列表视图中每个页面的记录数.
- spark遇到的问题及解决方法
1. 表中数据过亿,加载速度过慢,而我只需要加载增量数据 如:加载昨天一整天的数据,添加predicates分区,方法如下: //predicates相当于是把昨天的数据分成一个区,其它的数据不加载 ...
- 一键配置树莓派wifi、静态ip等
系统老是被我玩坏,重新烧录系统后配置又太麻烦,用shell脚本一键配置一下wifi和静态IP #!/bin/bash touch /media/fanghaoyu/boot/ssh echo &quo ...
- gitlab修改IP地址及仓库地址
将IP修改为192.168.10.100,操作方法 . 先修改本地的IP地址 vim /etc/sysconfig/network-scripts/ifcfg-eth0TYPE=EthernetBOO ...
- css3过渡动画 transition
transition CSS3 过渡是元素从一种样式逐渐改变为另一种的效果. 要实现这一点,必须规定两项内容: 指定要添加效果的CSS属性 指定效果的持续时间 例如 这是下面代码的预览界面预览界面 & ...
- The 2016 ACM-ICPC Asia China-Final D. Ice Cream Tower 二分 + 贪心
题目大意: 对于给出的n个冰激凌球的大小,满足下面的球的大小是上一个的至少2倍,对于给出的k(由k的冰激凌球才能算作一个冰激凌塔),问n个冰激凌球可以最多堆出多少个高度为k的冰激凌塔 题目分析: 对于 ...