0

是否可以将它与线程中的所有内容一起使用,并带有锁定?

主要思想是跟踪某个网络方法是否已被同一用户调用,因此我们希望在一分钟内阻止超过 X 个调用。我们会将一些数据保存在相关的 HashTable 中。

4

2 回答 2

0

asp.net 会话有一个很大的缺点。除非会话处于 ReadOnly 状态,否则它会锁定执行相同的 sessionId 请求。我没有以这种方式使用它,但它认为它可以解决您的任务。

ASP.NET 会话状态概述

并发请求和会话状态

每个会话对 ASP.NET 会话状态的访问是独占的,这意味着如果两个不同的用户发出并发请求,则同时授予对每个单独会话的访问权限。但是,如果对同一个会话发出两个并发请求(通过使用相同的 SessionID 值),则第一个请求将获得对会话信息的独占访问权。第二个请求仅在第一个请求完成后执行。(如果因为第一个请求超过了锁超时,信息上的独占锁被释放,第二个会话也可以获得访问权。)如果@Page指令中的EnableSessionState值设置为ReadOnly,则请求只读会话信息不会导致对会话数据的独占锁定。然而,

于 2012-11-21T09:29:02.563 回答
0

ASP.NET 会话依赖于 cookie,恶意用户很容易绕过这些 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;
}

免责声明:我只是在答案中写了这个伪代码,它可能包含错字。

于 2012-11-21T10:21:05.537 回答