Razor 페이지가있는 ASP.NET Core 2.1에서 동시성을 위해 설계되지 않은 서버 측 SDK를 사용하거나 다루는 방법

asp.net-core blazor c#

문제

업데이트 : 요청에 따라 다음은 내가 이루고자 노력하고있는 내용에 대한 설명과 내가 작업하고있는 상황에 대한 설명입니다.

본질적으로, 나는 모든 것을위한 기본 설정으로 완전히 구성된 Razor Pages 프레임 워크로 ASP.NET Core 2.1을 사용하는 웹 사이트를 만들고 있습니다. 중요한 참고 사항은 특정 외부 공급자를 응용 프로그램의 데이터 관리 서비스로 사용해야하므로 ASP.NET을 사용하여 데이터베이스를 구현할 수 없다는 것입니다. 이 때문에 대부분의 페이지에 대한 서버 측 코드에서 REST API보다 상호 작용하기가 쉽기 때문에 해당 관리 서비스에 클라이언트 SDK를 사용하고 있습니다. 문제는 SDK가 한 번에 하나의 세션에서 사용되도록 설계되어 "현재 사용자"와 같은 세션 데이터가 포함 된 정적 속성을 노출한다는 사실 때문에 동시성 문제가 발생한다는 것입니다. 내가 묻는 것은 각각의 세션이 자신의 "현재 사용자"가 될 수 있도록 또는 생성 된 세션마다 새로운 실행 또는 메모리 도메인을 만들 수있는 방법이다. 그렇지 않으면 SDK를 사용할 때 발생하는 동시성의 악몽을 어떻게 해결할 수 있을까? 전체 백엔드에서 한 번에 한 명의 사용자 및 / 또는 세션 만 클라이언트 거래를하도록 설계되었습니다. Blazor에 대한 필자의 이전 노트는 내가 생각하는 가장 쉬운 아날로그를 설명하려고 시도 할 때이 문제에 대한 해결책이 될 수 있습니다. 세션 데이터를 저장하는 것에 대해 들었습니다. 그러나 내가 아는 한, 모든 것을 JSON에 직렬화하고 어딘가에 파일에 저장해야합니다. 데이터가 기밀로 유지 될 수 있으므로 저에게 적합하지 않습니다.

이전 설명 (여전히 다소 관련 있음) : ASP.NET Core 2.1 기반의 웹 사이트를 만들고 특정 응용 프로그램 인스턴스 및 / 또는 세션에 고유 한 AppDomain 사용하도록 설계된 SDK를 사용하려고합니다. 즉, SDK에 정적 인 데이터 저장 멤버 (필드, 속성 등)를 노출하는 여러 API가 있음을 의미합니다. ASP.NET 코어와 함께 이러한 SDK를 사용하는 측면에서 볼 때이 노출 구조는 문제가되는 것 같습니다. 런타임은 모든 세션에 대해 서버 측에서 하나의 AppDomain 집합 적으로 할당하기 때문입니다. 공유 할 수 있습니다. 이 SDK의 출처에 액세스 할 수없고 변경할 수없는 경우 플랫폼 독립적 인 목적으로 한 번에 한 세션에 대해서만 데이터를 저장할 수있을뿐 아니라 SDK를 어떻게 성공적으로 사용할 수 있습니까? 다음은 내가 작업하고있는 단순화 된 버전입니다.

샘플 API :

public sealed class User
{
    public static User ActiveUser { get; private set; } 

    public static int TotalLogCyclesThisSession { get; private set; } = 0

    public string Username { get; internal set; }

    private string Password { get; internal set; }

    public string Name { get; internal set; }

    public string AccessKey { get; }

    public User(string username, string password)
    {
        /* Populate Instance Properties with Relevant Data */

        ActiveUser = this;
    }

    public void Logout()
    {
        /* Clear Data from Settable Instance Properties */

        ActiveUser = null;
        TotalLogCyclesThisSession++;
    }
}

정적 변수는 SDK의 다른 위치에서도 사용된다고 가정하십시오.

기본적으로 위의 API가 실제라면 ASP.NET Core에서 어떻게 사용합니까? 모든 세션에서 세션 별 정적 변수를 포함하여 사용할 SDK 전체 사본을 갖게됩니다. 가능하다면 Blazor에서 구현 한 솔루션이 적용되지 않을 수도 있음을 알고 있지만 Blazor "클라이언트"어셈블리를 만드는 방법, 모든 세션에 대해 새로운 AppDomain 이있는 방법, "서버"어셈블리를 찾는 방법과 같은 것을 찾고 있습니다. ASP.NET 코어는 그렇지 않지만 브라우저 - 로컬 런타임도 활성화되어 있다고 생각하면됩니다. 최악의 시나리오 인 경우 API를 수정할 수는 있지만 대부분의 범위에서 플랫폼에 독립적이어야합니다. 모든 도움을 미리 감사드립니다.

인기 답변

나는 당신의 문제를 이해하기가 힘듭니다. 그러나 문제는 Blazor에 관한 약간의 혼란이지만, 내가 틀렸다면 나에게 올바른 생각을 전합니다.

"모든 세션에 대해 새 AppDomain이있는 Blazor"클라이언트 "어셈블리를 만듭니다"

따라서 Blazor는 .NET에서 클라이언트를 구현하고 브라우저에서 WebAssembly를 실행하는 클라이언트 측 SPA입니다. 그래서 기술적으로 당신은 고전적인 "세션", 세션 쿠키, 아무것도 가지고 있지 않습니다. 그리고 전체 컨텍스트가 단일 사용자가 사용하는 브라우저 메모리에 있기 때문에 방어 적으로 여러 개가 아닙니다. Blazor에 대해 Angular 또는 React App과 같은 JS SPA를 생각해보십시오. SPA는 일반적으로 승인되거나 불허 될 수있는 (상태 비 저장) API와 함께 사용됩니다. 여기서도 똑같이 할 수 있습니다. 그냥 토큰 (OAuth2)을 획득하여 API에 전달하십시오. 여기에 묻는 것보다 사용자 개체와 비슷한 동작을하는 예제 코드가 있습니다 : UserModel.cs 그리고 여기에는 인증 된 클라이언트 인 ApiClient.cs 코드가 있습니다.

"세션"과 고전적인 방식으로 생각하고 싶다면. 기술적으로 세션은 브라우저 메모리, SPA 상태에 있습니다. 세션의 수명은 토큰의 만기 시간입니다. 그러나 JS 또는 Blazor라면 모든 SPA 응용 프로그램과 동일합니다.

이 도움이되어 귀하의 질문에 답변 해 주시기 바랍니다.




아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.