一度に 1 人のユーザーのみにアクセスしてページを制限する方法。asp.net を使用すると、global.asax を使用できますか? あるユーザーがページにアクセスしている場合、別のユーザーがそのページにアクセスできない場合、制限する他の方法はありますか? 1 人のユーザーがページにアクセスしているというメッセージを表示する必要があります。出来ますか。私を助けたり、参考にしたりできますか。
2 に答える
この種の問題に対処するためのより良い方法はおそらくたくさんありますが、実際にはこれが必要であると仮定します。
私がすること:
ページがロードされたとき (「ロック」されていないとき) に、ページがロードされたことをデータベースに記録して「ロック」するように、アプリケーションを作成します。実際のページでは、ある種の AJAX を使用して、5 ~ 15 秒ごとに Web サーバーを常にポーリングし、ユーザーがまだページにいることをアプリケーションに通知します。そして、最後の AJAX 呼び出しによってデータベースに保存された時間から 5 ~ 15 秒後にページのロックが解除されるようにします。
繰り返しますが、このような問題を回避するより良い方法があると本当に思っていますが、これはあなたの質問に対する直接的な回答です
これに基づいて:
はい、jupaol、それはアカウントに依存します。私の Web アプリケーションでは、1 つのレポートで 1 人のユーザーのみを承認する必要がありますが、承認権限には 2 人のユーザーがいます。両方が同じページにアクセスして一度に承認すると、大変なことになります。ここではデータベースを使用していません。
この問題は同時実行性に関連しています。このような問題に直面する方法はいくつかあります。たとえば、最も簡単な方法は、楽観的同時実行性を使用することです。これにデータベースを使用していない場合でも、エミュレートできます。
レポートを承認済みとしてマークするために、承認者の結果をどこかに保存する必要があります。これを念頭に置いて、次のようなことができるはずです。
- ページをレンダリングする前に、最新のレポート ステータスを取得します
- レポートが承認されていない場合は、通常どおりレンダリングします
- レポートが数秒前に承認された場合は、それを承認した人をレポートする読み取り専用モードでレンダリングします (または同様のアプローチ)。
- ChangeStatusメソッドに検証を追加します。このメソッドでは、次の操作を行います。
- 現在のレポートの最新ステータスを取得する
- レポートがまだ検証されていない場合は、スレッドをブロックし (
Mutex
または同様のものを使用できます)、レポートを検証済みとしてマークします。 - レポートが既に検証されている場合は、ドメイン例外を発生させ、ページで正しく処理します (おそらく、レポートが既に検証されていることを説明する読み取り専用モードでページをレンダリングします)。
より応答性の高いアプリケーション (RIA) が必要な場合は、次のアプローチを検討することをお勧めします。
おそらくこれは最悪のアプローチですが、それでもオプションです。ユーザーがページをリクエストしたときにログを追跡し続け、その後のリクエストでログがまだ有効かどうかを確認し、そうでない場合は、別のページにリダイレクトして、ページは使用中です。それ以外の場合は、ページへのアクセスを許可します。システムの不整合を防ぐためにこの単純な検証に依存するため、これはエラーが発生しやすいアプローチであると思います。また、次のアプローチで説明するポーリングの問題が発生する可能性があります。
AJAX を使用してサービスからデータをポーリングし、レポートが承認されているかどうかを確認します。おそらくこれがこれを実現する最も簡単な方法ですが、サーバーを絶えずポーリングすることになり、最終的にスケーラビリティの問題が発生するため、お勧めしません。
サーバー イベントが発生するたびに、 Cometを使用してブラウザー (クライアント) に通知を受け取ることができます。この場合は、レポートが承認されたときです。このアプローチの問題は、通知を受け取るためにサーバーとの接続を開いたままにしておく必要があることです。
最後のアプローチであり、最近最も推奨されているのはWeb Socketsを使用することです。これは、リアルタイムで通知を取得するために StackOverflow で使用されるテクノロジーです。