是否有可能像使用鎖定一樣在線程中使用它?在ASP.NET web服務中使用靜態變量(如跨線程)
主要思想是跟蹤某個web方法是否已經被同一個用戶調用,所以我們想要在一分鐘內阻止超過X個調用。我們會保留一些數據在相關的HashTable中。
是否有可能像使用鎖定一樣在線程中使用它?在ASP.NET web服務中使用靜態變量(如跨線程)
主要思想是跟蹤某個web方法是否已經被同一個用戶調用,所以我們想要在一分鐘內阻止超過X個調用。我們會保留一些數據在相關的HashTable中。
ASP.NET會話依賴於cookie,這些cookie很容易被惡意用戶繞過。由於惡意用戶似乎是你的問題,ASP.NET會話不是解決方案。
您可以編寫一個包裝類,其中包含靜態字典< UserID,列表< 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;
}
聲明:我剛纔寫的僞代碼的回答,它可能包含錯字的。
asp.net會話有一個很大的缺點。它會鎖定執行相同的sessionId請求,除非會話處於ReadOnly狀態。我沒有那樣用它,但它認爲它可以解決你的任務。
ASP.NET Session State Overview
併發請求和會話狀態
訪問ASP.NET會話狀態是每個會話,這意味着獨家 ,如果兩個不同的用戶進行的併發請求,訪問每個 單獨的會話同時授予。但是,如果兩個併發的 請求是針對同一個會話(通過使用相同的SessionID 值)進行的,則第一個請求將獲得對會話 信息的獨佔訪問權限。第二個請求僅在第一個請求 完成後才執行。 (如果由於第一個請求超出了 鎖定超時而對鎖定信息的唯一鎖定 被釋放,則第二個會話也可以訪問。)如果指令中的EnableSessionState值設置爲ReadOnly,則對只讀會話 信息不會導致對會話數據的獨佔鎖定。 但是,會話數據的只讀請求可能仍然需要等待 才能清除會話數據的讀寫請求所設置的鎖定。
所以沒有什麼內置的權利?關於我們的想法,我們用鎖定機制填充數據的一些靜態列表? – Stovar