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[] を保存するメカニズムを提供しています。 オブジェクトのシリアル化/逆シリアル化はすべて、ユーザーが手動で行う必要があります。

アダプター インフラストラクチャは、任意のセッション ストレージ システムを実装するために使用できる 2 つのインターフェイスを公開しています。 以下にそれらを示します。

  • Microsoft.AspNetCore.SystemWebAdapters.ISessionManager: これには、HttpContext とセッション メタデータが渡され、ISessionState オブジェクトが返されることを想定する 1 つのメソッドがあります。
  • 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");
    });

実装

現在配布されているセッション状態オブジェクトには 2 つの利用可能な実装があり、それぞれにいくつかの機能のトレードオフがあります。 アプリに最適な選択は、アプリが移行のどのパートにあるかによって異なり、時間の経過に伴って変化する可能性があります。

  • 厳密に型指定: オブジェクトにアクセスする機能を提供し、期待される型にキャストできます
  • ロック: 1 つのセッション内の複数の要求がキューに登録され、同時にセッションにアクセスしないことを保証します
  • スタンドアロン: ASP.NET Framework と ASP.NET Core の間でセッションを共有していない場合に使用し、SessionState を参照するクラス ライブラリのコードの変更を防ぎます

使用可能な実装を以下に示します。

実装 厳密な型指定 ロック スタンドアロン
リモート アプリ ✔️ ✔️
ラップされた ASP.NET Core ✔️ ✔️