從 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
自訂的。
會透過 JsonSessionSerializerOptions
來設定預設 JSON 實作:
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 | ✔️ | ⛔ | ✔️ |