一、配置回话状态

Microsoft.AspNetCore.App metapackage 中包含的 Microsoft.AspNetCore.Session 包提供中间件来管理会话状态。 若要启用会话中间件,Startup 必须包含:

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 服务器日志中但不显示在浏览器中。

二、以异步方式加载会话状态

只有在 TryGetValueSet 或 Remove 方法之前显式调用 ISession.LoadAsync 方法,ASP.NET Core 中的默认会话提供程序才会从基础 IDistributedCache 后备存储以异步方式加载会话记录。 如果未先调用 LoadAsync,则会同步加载基础会话记录,这可能对性能产生大规模影响。

若要让应用强制实施此模式,如果未在 TryGetValueSet 或 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 扩展方法:

以下示例在 Razor Pages 页中检索 IndexModel.SessionKeyName 键(示例应用中的 _Name)的会话值:

@page
@using Microsoft.AspNetCore.Http
@model IndexModel ... Name: @HttpContext.Session.GetString(IndexModel.SessionKeyName)

更多:

.Net Core3 新特性整理

Asp.net Core CacheHelper 通用缓存帮助类

.NetCore中EFCore的使用整理(三)-关联表操作

最新文章

  1. 探索逻辑事务 TransactionScope
  2. 利用JNI技术在Android中调用、调试C++代码
  3. vim中执行shell命令
  4. JS 获取FileUpload1控件地址
  5. P1403约数研究
  6. android - anim translate中 fromXDelta、toXDelta、fromYDelta、toXDelta属性
  7. Xquartz远程访问linux
  8. ioc容器
  9. 常用myeclipse的快捷键,对菜鸟超有用的
  10. 进口fbx角色动画read-only解
  11. 【javascript】判断浏览设备是手机还是电脑
  12. 用C++实现的元胞自动机
  13. Mac terminal commands
  14. ad 线束和网络
  15. HAOI(十二省联考)2019 qwq记
  16. ssh 报错Host key verification failed 或Ubuntu connect to serve 失败
  17. Fiddler抓包配置具体步骤
  18. Revit Family API 添加材质参数设置可见性
  19. .NET 互联网技术简介
  20. Hyper-v 中 CentOS 连接外网之有线网卡

热门文章

  1. CSS 基础样式
  2. scrapy框架之代理的使用
  3. SpringBoot + Nginx 配置HTTPS的一次经历
  4. java8中日期字符串的月日时分秒自动补零
  5. Cobbler--自动化部署
  6. (十三)Kubernetes Dashboard
  7. Pytorch之Dataparallel源码解析
  8. python-uiautomator2
  9. 题解:UVa1025 A Spy in the Metro
  10. sed命令基本用法