2012-11-21 61 views

回答

0

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; 
} 

聲明:我剛纔寫的僞代碼的回答,它可能包含錯字的。

0

asp.net會話有一個很大的缺點。它會鎖定執行相同的sessionId請求,除非會話處於ReadOnly狀態。我沒有那樣用它,但它認爲它可以解決你的任務。

ASP.NET Session State Overview

併發請求和會話狀態

訪問ASP.NET會話狀態是每個會話,這意味着獨家 ,如果兩個不同的用戶進行的併發請求,訪問每個 單獨的會話同時授予。但是,如果兩個併發的 請求是針對同一個會話(通過使用相同的SessionID 值)進行的,則第一個請求將獲得對會話 信息的獨佔訪問權限。第二個請求僅在第一個請求 完成後才執行。 (如果由於第一個請求超出了 鎖定超時而對鎖定信息的唯一鎖定 被釋放,則第二個會話也可以訪問。)如果指令中的EnableSessionState值設置爲ReadOnly,則對只讀會話 信息不會導致對會話數據的獨佔鎖定。 但是,會話數據的只讀請求可能仍然需要等待 才能清除會話數據的讀寫請求所設置的鎖定。

+0

所以沒有什麼內置的權利?關於我們的想法,我們用鎖定機制填充數據的一些靜態列表? – Stovar