是否可以将它与线程中的所有内容一起使用,并带有锁定?
主要思想是跟踪某个网络方法是否已被同一用户调用,因此我们希望在一分钟内阻止超过 X 个调用。我们会将一些数据保存在相关的 HashTable 中。
是否可以将它与线程中的所有内容一起使用,并带有锁定?
主要思想是跟踪某个网络方法是否已被同一用户调用,因此我们希望在一分钟内阻止超过 X 个调用。我们会将一些数据保存在相关的 HashTable 中。
asp.net 会话有一个很大的缺点。除非会话处于 ReadOnly 状态,否则它会锁定执行相同的 sessionId 请求。我没有以这种方式使用它,但它认为它可以解决您的任务。
并发请求和会话状态
每个会话对 ASP.NET 会话状态的访问是独占的,这意味着如果两个不同的用户发出并发请求,则同时授予对每个单独会话的访问权限。但是,如果对同一个会话发出两个并发请求(通过使用相同的 SessionID 值),则第一个请求将获得对会话信息的独占访问权。第二个请求仅在第一个请求完成后执行。(如果因为第一个请求超过了锁超时,信息上的独占锁被释放,第二个会话也可以获得访问权。)如果@Page指令中的EnableSessionState值设置为ReadOnly,则请求只读会话信息不会导致对会话数据的独占锁定。然而,
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;
}
免责声明:我只是在答案中写了这个伪代码,它可能包含错字。