Razor Pagesを使用したASP.NET Core 2.1の同時実行性を考慮して設計されていないサーバーサイドSDKを使用する方法

asp.net-core blazor c#

質問

アップデート:それは私の達成しようとしていることのより明確な説明と、私が働いている文脈の記述です。

基本的には、私はRazor PagesフレームワークでASP.NET Core 2.1を使用してWebサイトを作成しており、すべての設定を完全にデフォルト設定しています。重要なのは、アプリケーションのデータ管理サービスとして特定の外部プロバイダを使用する必要があるため、ASP.NETでデータベースを実装するだけでは不十分であることです。このため、ほとんどのPagesのサーバー側コードでは、REST APIとのやりとりが容易であるため、前述の管理サービスにクライアントSDKを使用しています。問題は、SDKが一度に1つのセッションで使用されるように設計されているため、「現在のユーザー」などのセッションデータを含む静的プロパティが公開されるため、同時実行性の問題が発生しています。私が尋ねるのは、作成されたセッションごとに新しい実行またはメモリドメインを作成して、それぞれが自分自身の「現在のユーザー」を持つことができるかどうか、またはSDKの実行時に発生する同時性の悪夢バックエンド全体で、一度に1人のユーザーおよび/またはセッションにのみクライアント取引を行うように設計されています。 Blazorに関する私のこれまでのメモは、私が思うところで最も簡単なアナログを記述しようとしたところで、この問題の解決策となる可能性があります。セッションデータの保存について聞いたことがあります。しかし、私が知っている限り、すべてがJSONにシリアル化され、どこかのファイルに保存されなければなりません。これは、データが機密扱いになる可能性があるため、私にとってはうまくいきません。

以前の説明(まだまだ関連しています): ASP.NET Core 2.1を搭載したWebサイトを作成していて、特定のアプリケーションインスタンスやセッションに固有のAppDomainで使用するように設計されたSDKを使用しようとしています。つまり、SDKには静的なデータ記憶メンバー(フィールド、プロパティなど)を公開する複数のAPIがあります。 ASP.NETコアでこのようなSDKを使用する場合、この露出構造は問題になるようですが、ランタイムはすべてのセッションについてまとめて1つのAppDomainのみをサーバー側に割り当てます。共有する。このSDKのソースにアクセスできない、または変更できない場合、プラットフォームアグノスティックスに関連する目的で、一度に1つのセッションのデータを格納するだけで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 Coreはそうではありませんが、ブラウザローカルランタイムもアクティブになっていると考えます。最悪の場合のシナリオでは、APIは変更できますが、ほとんどのエクステントに対してプラットフォームに依存しないものでなければなりません。事前にすべてのヘルプに感謝します。

人気のある回答

私はあなたの問題を理解するのに苦労します。しかし、問題はBlazorに関するいくつかの混乱だと思っていますが、私が間違っていれば私を修正してください。

"すべてのセッションに新しいAppDomainを持つBlazor" Client "アセンブリを作成する"

だからBlazorは.NET上に構築されたクライアントサイドのSPAで、ブラウザでWebAssemblyを実行します。技術的にはクラシックな「セッション」はなく、セッションクッキーはありません。また、単一のユーザーが使用していたブラウザーのメモリにコンテキスト全体が含まれているため、複数のものを防御的に使用することはできません。 JS SPAのようなBlazorについて考えるとAngular or React Appがあります。承認されるかどうかにかかわらず通常は(ステートレスな)APIで使用されるSPAここでも同じことができます。トークン(OAuth2)を取得してAPIに渡すだけです。ここでは、あなたが求めていたものと同じような何らかのユーザーオブジェクトを実行するサンプルコードを示します: UserModel.csここには、AuthorizedクライアントのApiClient.csコードがあります。

あなたが "セッション"と古典的な方法で考えたい場合。技術的には、セッションはブラウザメモリ、SPA状態にあります。セッションの存続期間は、トークンの有効期限です。しかし、JSまたはBlazorなら、それはすべてのSPAアプリケーションで同じです。

私はこれがあなたの質問に役立つことを願っています。




ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ