다음을 통해 공유


ASP.NET에서 ASP.NET Core로 증분 세션 상태 마이그레이션

세션 상태

ASP.NET Framework의 세션 상태는 ASP.NET Core가 제공하지 않는 여러 기능을 제공했습니다. ASP.NET Framework에서 Core로 업데이트하기 위해 어댑터는 비슷한 동작 System.Web 으로 세션 상태를 채울 수 있는 메커니즘을 제공합니다. 프레임워크와 코어 간의 몇 가지 차이점은 다음과 같습니다.

  • 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) - 알려진 형식에 세션 키를 등록합니다. 세션 상태를 올바르게 직렬화/역직렬화하려면 이 작업이 필요합니다. 등록이 없다는 키가 발견되면 오류가 throw되고 세션을 사용할 수 없습니다.
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 ✔️ ✔️