2009-08-11 65 views
5

我正在開發一個Asp.net(MVC,但這並不重要)應用程序。我有一個自定義的IHttpModule負責PostAuthenticateRequest以更改用戶主體的身份。請求之間持久化/緩存數據 - 常用方法

我在用戶登錄時將用戶ID和用戶名存儲在身份驗證cookie中。我有一個IUser(由DAO和Business Objects層實現,每個都有自己的額外成員),我需要所有的Business Service類。當用戶需要任何東西時,我必須提供IUser對象實例(通常來自Business Objects層),因此從身份驗證票證提供ID是不夠的。

所以我在想如何以及在哪裏最好堅持登錄用戶的IUser數據?

  1. 我不想每次從數據庫中獲取它(基於身份驗證票證的用戶ID數據)
  2. 我不能把它存儲在會話,因爲我不得不在屋裏PostAuthenticateRequest,其中會話ISN」工作準備好面對尚未
  3. 我希望所有的功能,我自定義的內封裝的IHttpModule

的選擇,我看到:

  • 緩存
  • 餅乾
  • (會話) - 由PostAuthenticateRequest移動到PostAcquireRequestState事件和變更主/身份出現,但我想避免這種

過程似乎使事情變得複雜是:

  1. 用戶登錄項,用戶數據是從DB中取出並以某種方式持續購買請求
  2. 用戶登錄手續,用戶數據已經被從持久介質自動魔法除去LY
  3. 用戶更改自己的配置文件,用戶數據將被廢棄,並從DB

我wan't這一切要由HTTP模塊自動處理(如果可能的話)消除開發人員的錯誤重讀的下一個請求忘記重置這些東西。

我也不想要的是寫/讀一些硬編碼的變量/鍵,並在應用程序的其他部分操縱它們。這隻會造成技術債務。

問題

  1. 你有什麼建議?
  2. SO如何在請求之間保持用戶數據?

回答

4

根據您的要求,我想最好的解決方案是從cookie中檢索ID並使用它來索引Http緩存(HttpContext.Current.Cache)。

如果要維護用戶訪問它的方式,請將緩存包裝在「UserCache」對象中。該對象可以由HttpModule構造並作爲一個(等待它......)單例存儲在緩存本身中,或者更好的是,當需要從http緩存中取出時構建。這將取決於您需要訪問它的位置以及HttpContext.Current.Cache是​​否可直接使用。下面是懶惰的實現。

再一次,這是爲了清楚,而不是我實際上如何實現它。

public class UserCache 
{ 
    public IUser GetUser(object userKey) 
    { 
    return HttpContext.Current.Cache[userKey]; 
    } 

    public void AddUser(object userKey, IUser user) 
    { 
    /* this could pull the key from the user object as well. */ 
    HttpContext.Current.Cache.Add(/* add the object with key and a sliding expiration that is slightly greater than session timeout */); 
    } 

    public void ExpireUser(object userKey) 
    { 
    HttpContext.Current.Cache.Remove(userKey); 
    } 

    /* If you don't want to do SQL cache dependency */ 
    public void UpdateUser(object userKey, IUser user) 
    { 
    HttpContext.Current.Cache.Insert(/* ... */); 
    } 
} 

使用默認的緩存機制(或更好,但通過DI提供這樣你就不會依賴於一種方式的緩存機制),你可以在註釋中設置過期從緩存中自動刪除用戶。您可以將緩存設置爲依賴於SQL Server更新,以便處理更新或手動更新它作爲服務的一部分以保存更改。

有關默認緩存的更多信息可用here。有關cache dependencies的更多信息,請致電here

在HttpModule本身中,我想你可以在EndRequest事件中做一些魔術來查看請求是否已經過驗證,然後根據cookie登錄用戶,但我不確定這是否會像我一樣工作我從來沒有嘗試過。您可能需要在1.1天內在WAY上查看MSDN上的this article,看看它是否回答了您嘗試解決的一些問題。

至於SO體系結構以及它們是如何實現的,我會想象它們會在需要時加載它,因爲它們始終將大部分數據庫保存在RAM中(http://highscalability.com/stack-overflow-architecture)。