共用方式為


從 ASP.NET 到 ASP.NET Core 的累加工作階段狀態移轉

工作階段狀態

ASP.NET Framework 中的工作階段狀態提供了一些 ASP.NET Core 未提供的功能。 為了從 ASP.NET Framework 更新到 Core,配接器提供了機制,能夠透過類似 System.Web 的行為填入工作階段狀態。 Framework 和 Core 之間的一些差異如下:

  • ASP.NET Framework 會鎖定工作階段中的工作階段使用方式,因此工作階段中的後續要求會以序列方式處理。 這與未提供上述任何保證的 ASP.NET Core 不同。
  • ASP.NET Framework 會將物件自動序列化和還原序列化 (除非在記憶體中完成)。 ASP.NET Core 會提供一個機制來儲存 byte[] 指定的金鑰。 使用者必須手動完成任何物件序列化/還原序列化。

配接器基礎結構會公開兩個介面,可用來實作任何工作階段儲存體系統。 這些包括:

  • Microsoft.AspNetCore.SystemWebAdapters.ISessionManager:這有單一方法會傳遞 HttpContext 和工作階段中繼資料,並預期傳回 ISessionState 物件。
  • Microsoft.AspNetCore.SystemWebAdapters.ISessionState:這會描述工作階段物件的狀態。 它會用來當作 HttpSessionState 型別的備份。

序列化

由於配接器能夠使用強型別的工作階段狀態,因此我們必須能夠將型別序列化和還原序列化。 這是透過 Microsoft.AspNetCore.SystemWebAdapters.SessionState.Serialization.ISessionKeySerializer 自訂的。

預設的 JSON 實作是透過 JsonSessionSerializerOptions 來設定:

  • RegisterKey<T>(string) - 向已知型別註冊工作階段金鑰。 必須如此,才能正確地將工作階段狀態序列化/還原序列化。 如果發現金鑰沒有註冊,將會擲回錯誤,而且無法使用工作階段。
builder.Services.AddSystemWebAdapters()
    .AddJsonSessionSerializer(options =>
    {
        // Serialization/deserialization requires each session key to be registered to a type
        options.RegisterKey<int>("test-value");
    });

實作

目前隨附的工作階段狀態物件有兩個可用的實作,每個實作在功能上都有一些取捨。 應用程式的最佳選擇可能取決於它處於移轉的哪個部分,而且可能會隨時間而變更。

  • 強型別:提供存取物件的能力,而且可以轉換為預期的類型
  • 鎖定:確保單一工作階段中的多個要求已排入佇列,且不會同時存取工作階段
  • 獨立:當您未在 ASP.NET Framework 與 ASP.NET Core 之間共用工作階段時使用,避免修改以 SessionState 作為參考之類別庫中的程式碼

以下是可用的實作:

實作 強型別 鎖定 獨立
遠端應用程式 ✔️ ✔️
已包裝的 ASP.NET Core ✔️ ✔️