asp.net core session使用

1、配置回話狀態html

Microsoft.AspNetCore.App metapackage 中包含的 Microsoft.AspNetCore.Session 包提供中間件來管理會話狀態。 若要啓用會話中間件,Startup 必須包含:api

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

2、以異步方式加載會話狀態

只有在 TryGetValueSet 或 Remove 方法以前顯式調用 ISession.LoadAsync 方法,ASP.NET Core 中的默認會話提供程序纔會從基礎 IDistributedCache 後備存儲以異步方式加載會話記錄。 若是未先調用 LoadAsync,則會同步加載基礎會話記錄,這可能對性能產生大規模影響。session

若要讓應用強制實施此模式,若是未在 TryGetValueSet 或 Remove 以前調用 LoadAsync 方法,那麼使用引發異常的版本包裝 DistributedSessionStore 和 DistributedSession 實現。 在服務容器中註冊的已包裝的版本。mvc

3、會話選項

若要替代會話默認值,請使用 SessionOptionsapp

選項 說明
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 是做爲一個連貫會話實現的,這意味着全部內容都存儲在一塊兒 。 兩個請求試圖修改不一樣的會話值時,後一個請求可能替代前一個作出的會話更改。

4、設置和獲取會話值

使用 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的使用整理(三)-關聯表操做

相關文章
相關標籤/搜索