1、配置回話狀態html
Microsoft.AspNetCore.App metapackage 中包含的 Microsoft.AspNetCore.Session 包提供中間件來管理會話狀態。 若要啓用會話中間件,Startup
必須包含:api
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(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(); } }
中間件的順序很重要。 在前面的示例中,在 UseMvc
以後調用 UseSession
時會發生 InvalidOperationException
異常。 有關詳細信息,請參閱中間件排序。瀏覽器
配置會話狀態後,HttpContext.Session 可用。緩存
調用 UseSession
之前沒法訪問 HttpContext.Session
。服務器
在應用已經開始寫入到響應流以後,不能建立有新會話 Cookie 的新會話。 此異常記錄在 Web 服務器日誌中但不顯示在瀏覽器中。cookie
只有在 TryGetValue、Set 或 Remove 方法以前顯式調用 ISession.LoadAsync 方法,ASP.NET Core 中的默認會話提供程序纔會從基礎 IDistributedCache 後備存儲以異步方式加載會話記錄。 若是未先調用 LoadAsync
,則會同步加載基礎會話記錄,這可能對性能產生大規模影響。session
若要讓應用強制實施此模式,若是未在 TryGetValue
、Set
或 Remove
以前調用 LoadAsync
方法,那麼使用引發異常的版本包裝 DistributedSessionStore 和 DistributedSession 實現。 在服務容器中註冊的已包裝的版本。mvc
若要替代會話默認值,請使用 SessionOptions。app
選項 | 說明 |
---|---|
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(10); 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)
更多: