다음을 통해 공유


사용 지침

Microsoft.AspNetCore.SystemWebAdapters는 ASP.NET Core에서 ASP.NET 프레임워크의 동작을 모방하는 에뮬레이션 계층을 제공합니다. 다음은 사용 시 고려 사항 중 일부에 대한 몇 가지 지침입니다.

HttpContext 수명

어댑터는 요청의 수명 동안 사용할 수 없는 HttpContext에 의해 백업됩니다. 따라서 HttpContext은 ASP.NET Core 실행 시 요청을 지나서도 사용할 수 없지만 ASP.NET Framework에서는 때때로 작동합니다. 요청이 종료된 후에 사용되는 경우 ObjectDisposedException이 throw됩니다.

권장 사항: POCO에 필요한 값을 저장하고 유지합니다.

HttpContext으로 변환

HttpContextHttpContext로 변환하는 방법에는 두 가지가 있습니다.

  • 암시적 캐스팅
  • 생성자 사용

권장 사항: 대부분의 경우 생성된 인스턴스를 캐시하고 요청당 단일 HttpContext만 보장하므로 암시적 캐스팅을 선호해야 합니다.

CurrentCulture는 기본적으로 설정되지 않습니다.

ASP.NET Framework에서 CurrentCulture는 요청에 대해 설정되었지만 ASP.NET Core에서 자동으로 수행되지는 않습니다. 대신 파이프라인에 적절한 미들웨어를 추가해야 합니다.

권장 사항: 이를 사용하도록 설정하는 방법에 대한 자세한 내용은 ASP.NET Core 지역화를 참조하세요.

ASP.NET Framework와 유사한 동작으로 이를 사용하도록 설정하는 가장 간단한 방법은 파이프라인에 다음을 추가하는 것입니다.

app.UseRequestLocalization();

CurrentPrincipal

ASP.NET Framework에서 CurrentPrincipalCurrent는 현재 사용자로 설정됩니다. ASP.NET Core에서 사용할 수 없습니다. 엔드포인트에 ISetThreadCurrentPrincipal를 추가하여 이러한 어댑터에서 이 지원을 사용할 수 있습니다(SetThreadCurrentPrincipalAttribute를 통해 컨트롤러에서 사용 가능). 그러나, 사용량을 제거하기 위해 코드를 리팩터링할 수 없는 경우에만 사용해야 합니다.

권장 사항: 가능하면 속성을 User 사용하거나 User 대신 호출 사이트로 전달합니다. 가능하지 않은 경우, 현재 사용자 설정을 사용하도록 설정하고 요청을 논리적 단일 스레드로 설정하는 것도 고려합니다(자세한 내용은 아래 참조).

요청 스레드가 ASP.NET Core에 존재하지 않습니다

ASP.NET Framework에서 요청은 스레드 선호도를 가지며 해당 스레드에 있는 경우에만 Current를 사용할 수 있습니다. ASP.NET Core는 이를 보장하지 않으므로, Current은 동일한 비동기 컨텍스트 내에서 사용할 수 있지만 스레드에 대한 보장은 없습니다.

권장 사항: HttpContext에 대한 읽기/쓰기를 수행하는 경우, 단일 스레드 방식으로 이 작업을 수행하는지 확인해야 합니다. ISingleThreadedRequestMetadata를 설정하여 비동기 컨텍스트에서 요청을 동시에 실행하지 않도록 강제할 수 있습니다. 이는 성능에 영향을 미치며 비동기 액세스를 보장하기 위해 사용을 리팩터링할 수 없는 경우에만 사용해야 합니다. SingleThreadedRequestAttribute를 사용하여 컨트롤러에 추가할 수 있는 구현이 있습니다.

[SingleThreadedRequest]
public class SomeController : Controller
{
    ...
} 

Request을 미리 버퍼해야 할 수 있음

기본적으로 들어오는 요청이 항상 검색 가능하거나 완전히 사용할 수 있는 것은 아닙니다. .NET Framework에 표시되는 동작을 가져오기 위해 입력 스트림의 사전 버퍼링을 옵트인할 수 있습니다. 그러면 들어오는 스트림을 완전히 읽고 메모리 또는 디스크에 버퍼링합니다(설정에 따라 다름).

권장 사항: IPreBufferRequestStreamMetadata 인터페이스를 구현하는 엔드포인트 메타데이터를 적용하여 사용하도록 설정할 수 있습니다. 컨트롤러 또는 메서드에 적용할 수 있는 특성 PreBufferRequestStreamAttribute으로 사용할 수 있습니다.

모든 MVC 엔드포인트에서 이를 사용하도록 설정하려면 다음과 같이 사용할 수 있는 확장 메서드가 있습니다.

app.MapDefaultControllerRoute()
    .PreBufferRequestStream();

Response 버퍼링이 필요할 수 있음

Response의 일부 API는 출력 스트림(예: Output, End(), Clear(), SuppressContent)을 버퍼링해야 합니다.

권장 사항: 보내기 전에 응답을 버퍼링해야 하는 Response 동작을 지원하려면 엔드포인트가 IBufferResponseStreamMetadata를 구현하는 엔드포인트 메타데이터를 사용하여 옵트인해야 합니다.

모든 MVC 엔드포인트에서 이를 사용하도록 설정하려면 다음과 같이 사용할 수 있는 확장 메서드가 있습니다.

app.MapDefaultControllerRoute()
    .BufferResponseStream();

공유 세션 상태

Session를 지원하려면, 엔드포인트가 ISessionMetadata를 구현하는 메타데이터를 통해 옵트인해야 합니다.

권장 사항: 모든 MVC 엔드포인트에서 이를 사용하도록 설정하려면 다음과 같이 사용할 수 있는 확장 메서드가 있습니다.

app.MapDefaultControllerRoute()
    .RequireSystemWebAdapterSession();

이를 위해서는 세션 저장소의 일부 구현도 필요합니다. 옵션에 대한 자세한 내용은 여기를 참조하세요.

원격 세션은 애플리케이션에 대한 추가 엔드포인트를 노출합니다.

원격 세션 지원은 핵심 앱이 세션 정보를 검색할 수 있는 엔드포인트를 노출합니다. 이로 인해 잠재적으로 수명이 긴 요청이 핵심 앱과 프레임워크 앱 사이에 존재할 수 있지만, 현재 요청 또는 세션 시간 제한(기본적으로 20분)으로 시간이 초과됩니다.

권장 사항: 사용된 API 키가 강력한 키이고 프레임워크 앱과의 연결이 SSL을 통해 수행되는지 확인합니다.

가상 디렉터리는 프레임워크 및 핵심 애플리케이션에 대해 동일해야 합니다.

가상 디렉터리 설정은 시스템 내의 경로 생성, 권한 부여 및 기타 서비스에 사용됩니다. 이 시점에서 ASP.NET Framework 작동 방식 때문에 다른 가상 디렉터리를 사용하도록 설정하는 신뢰할 수 있는 메서드가 없습니다.

권장 사항: 두 애플리케이션이 동일한 애플리케이션/가상 디렉터리 레이아웃을 사용하여 서로 다른 사이트(호스트 및 포트)에 있는지 확인합니다.