0

私は ASP.NET アプリケーションを使用していましたが、AJAX 要求のトラフィックが大量に発生しています。

ユーザーが Web アプリケーションにログインすると、このユーザーの状態に関する情報を保存するためのセッションが作成されます。現在、セッションデータの一貫性を維持するためのソリューションは非常に単純で残忍なものです。各リクエストは、処理される前に排他ロックを取得する必要があります

これは、従来の Web アプリケーションでは問題なく機能します。しかし、Web アプリケーションが AJAX をサポートするようになると、効率的ではなくなります。Web ページをリロードせずに、複数の AJAX リクエストが同時にサーバーに送信される可能性は十分にあります。すべての AJAX リクエストが排他ロックによってシリアル化されている場合、応答はそれほど速くありません。とにかく、同じセッション変数にアクセスしない多くの AJAX リクエストも同様にブロックされます。

リクエストごとに排他ロックがない場合は、デッドロックを回避するためにすべての競合状態を慎重に処理する必要があります。コードが複雑になり、バグが発生するのではないかと心配しています。

では、セッション データの一貫性を保ち、コードをシンプルかつクリーンに保つためのベスト プラクティスはありますか?

4

2 に答える 2

1

ユーザーが Web アプリケーションにログインすると、このユーザーの状態に関する情報を保存するためのセッションが作成されます。現在、セッション データの一貫性を維持するためのソリューションは非常に単純で残忍なものです。各リクエストは、処理される前に排他ロックを取得する必要があります。」

当社のソリューション」は、SessionStateModule を使用しておらず、カスタム ソリューションを使用していることを意味します。いずれにせよ、ASP.NET が提供する既定の "Session" オブジェクトを使用している場合は、既にロック機能が備わっているため、再度実装する必要はありません。

ASP.net はマーカー インターフェイス IReadOnlySessionState を提供して、特定の要求がセッションへの読み取りアクセスのみを必要とすることを示します (したがって、セッションはその特定の要求に対してロックされません)。詳細については、ここをクリックして「同時リクエストとセッション状態」セクションに移動してください

さて、あなたの質問に来て、AJAXサーバーサイドページメソッドにこのマーカーインターフェイスを使用する方法は、ページのプロパティEnableSessionStateを「ReadOnly」に設定することです。

AJAX Pro を使用している場合は、メソッドで AjaxPro.AjaxMethod(HttpSessionRequirement.ReadOnly) 属性を使用できます。

于 2010-04-04T11:55:28.797 に答える
1

この問題を解決するための一般的なアイデアを紹介します。

Mutexを使用し、ミューテックス名にはセッション ID を使用します。

ミューテックス ロックは、指定した名前に基づいているため、セッション間の競合を回避できます。

簡単な例http://aspalliance.com/290

ミューテックスとロック

ここにいくつかの回答があります
Monitor vs Mutex in c#

C# のさまざまなスレッド同期オプションの違いは何ですか?

あなたの場合、Mutex 名としてセッション ID を使用すると、この名前でロックされます。異なるセッション ID のユーザーはロックアウトされず、同じセッション ID の同じユーザーのみがロックされます。

あなたのユーザーはすべてのユーザーをロックダウンできると説明しているので、Mutex(sessionid) ではこれは起こりません。

同じサーバー内の多数のプール

同じサーバーで実行する場合、ミューテックスは問題ありません。

多くの Web サーバー

異なるWebサーバーを同期することに勝った場合は、共通のベース、共通のデータベース、または読み取り、書き込み、ロックなどが可能な共通のディレクトリが必要です。

共通ディレクトリの場合:
この場合、.\SharedDir\MutexSessionId1 のような名前を使用してミューテックスを作成できるかどうかはわかりませんが、作成できない場合は、後でファイル名を作成してロックすることで、自分で同様のものを作成できます。ファイルのロックは、あなたが要求したロックです。

共通データベースの場合:
アクションをロックおよび同期するために使用できるテーブルを作成して、mutex と同様の処理を行うことができます。

于 2010-04-03T15:40:11.973 に答える