一、配置回话状态
若要启用会话中间件,Startup 必须包含:
- ASP.NET Core 中的分布式缓存。
- AddSession 的调用。
- 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(10); 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(); } }
中间件排序。
HttpContext.Session 可用。
调用 UseSession 以前无法访问 HttpContext.Session。
此异常记录在 Web 服务器日志中但不显示在浏览器中。
二、以异步方式加载会话状态
如果未先调用 LoadAsync,则会同步加载基础会话记录,这可能对性能产生大规模影响。
在服务容器中注册的已包装的版本。
三、会话选项
SessionOptions。
| 选项 | 说明 |
|---|---|
| Cookie | IsEssential 默认为 false。 |
| IdleTimeout | 默认为 20 分钟。 |
| IOTimeout | 默认值为 1 分钟。 |
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(10); options.Cookie.IsEssential = true; }); }
会话中间件传递的每个请求都会重置超时。
两个请求试图修改不同的会话值时,后一个请求可能替代前一个做出的会话更改。
四、设置和获取会话值
ISession 实现。
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 通用缓存帮助类