ロックを使用して、スレッドのようにすべてで使用することは可能ですか?
主なアイデアは、一部の Web メソッドが同じユーザーによって既に呼び出されているかどうかを追跡することです。そのため、1 分間に X 回以上の呼び出しをブロックしたいと考えています。関連する HashTable にいくつかのデータを保持します。
ロックを使用して、スレッドのようにすべてで使用することは可能ですか?
主なアイデアは、一部の Web メソッドが同じユーザーによって既に呼び出されているかどうかを追跡することです。そのため、1 分間に X 回以上の呼び出しをブロックしたいと考えています。関連する HashTable にいくつかのデータを保持します。
asp.netセッションには大きな欠点があります。セッションがReadOnly状態でない限り、同じsessionIdリクエストの実行をロックします。私はそれをそのように使用していませんが、それはあなたの仕事を解決できると思います。
同時リクエストとセッション状態
ASP.NETセッション状態へのアクセスはセッションごとに排他的です。つまり、2人の異なるユーザーが同時に要求を行うと、別々の各セッションへのアクセスが同時に許可されます。ただし、(同じSessionID値を使用して)同じセッションに対して2つの同時要求が行われた場合、最初の要求はセッション情報への排他的アクセスを取得します。2番目の要求は、最初の要求が終了した後にのみ実行されます。(最初の要求がロックタイムアウトを超えたために情報の排他ロックが解放された場合も、2番目のセッションにアクセスできます。)@ PageディレクティブのEnableSessionState値がReadOnlyに設定されている場合、読み取り専用の要求セッション情報によって、セッションデータが排他的にロックされることはありません。でも、
ASP.NET セッションは、悪意のあるユーザーが簡単に回避できる Cookie に依存しています。悪意のあるユーザーが問題のように見えるため、ASP.NET セッションは解決策ではありません。
静的な Dictionary<UserID, List<DateTime>> を含むラッパー クラスを記述して、1 ~ 2 つのメソッドでのみディクショナリの操作を許可し、適切にロックすることができます。
例えば
class UserLogger
{
private Dictionary<int, List<DateTime>> _visits;
public bool AddPageVisit(int userID)
{
// lock dictionary
// add or update entry for the user,
// remove from all entries the datetimes older than a minute
// remove entries without datetimes
// check if number of datetimes for the user > max allowed
// unlock dictionary
}
}
class RestrictedController
{
private static UserLogger _userLogger;
}
免責事項:回答にこの疑似コードを書きましたが、タイプミスが含まれている可能性があります。