2014-12-09 68 views
0

我編碼的MVC 5互聯網應用,當用戶登錄時,我想日誌存儲在細節,使我可以檢索任何類這些細節。MVC 5會話和/或高速緩存數據

我做了一些研究,我可以緩存數據,或者這些數據存儲在一個會話。因爲當用戶登錄,並且是唯一相關的登錄用戶數據只設置,我認爲我應該使用下面的代碼:

Session[key] = data; 

有什麼缺點,或使用上面的代碼?會話數據是否超時,或者在用戶關閉瀏覽器和/或註銷之前是否持續存在?

另一種選擇是使用下面的代碼:

System.Web.HttpRuntime.Cache[key] = data; 

是否有使用上面的代碼時,我應該考慮什麼優勢?我目前傾向於使用Session[key] = data,因爲數據僅與登錄用戶相關,並且不是應用程序範圍。

在此先感謝。

回答

0

會話是每個用戶/會話,而緩存是每個應用程序。所以如果我理解的很好,緩存不會被用於你,不是嗎?

會話到期時,用戶關閉會話,或者您可以在不登錄或者用戶創建一個會話。您可以在web.config上設置會話的最長時間。當用戶關閉瀏覽器時會話關閉。

如果你想瀏覽器關閉之後也可在會議上,你必須混合餅乾和會話。 Cookies存儲在客戶端的瀏覽器中,可以託管sesssion的Id,但我不會推薦它。

+0

緩存做工作,做會議,我決定使用哪一個。會話何時到期? – user3736648 2014-12-09 13:25:57

+0

@ user373648我已經更新了我的答案 – clement 2014-12-09 14:10:08

0

鑑於您的問題中指定的要求,我相信您最好的方法是使用會話。您所描述的內容正是會話的完美之處 - 在訪問持續時間期間保留經常訪問的用戶特定數據。

會話當用戶關閉瀏覽器,或之後,可以通過你的應用程序指定超時到期。

至於使用會話對象,直接從控制器中引用Session對象,我強烈建議您查看使用IoC容器(如StructureMap)將會話注入到依賴於它們的類(如控制器或服務)。這使您可以針對接口而不是實現進行編程,並使代碼更具可測試性和可維護性。

這裏有來自blog post採取一個簡單的例子一個寫了關於這個問題的地方IUserInformation包含用戶的會話數據:

public class UserDetailController : Controller { 

    private readonly IUserInformation userInformation; 

    public void ExampleLoginController(IUserInformation userInformation) { 
     this.userInformation = userInformation; 
    } 

    [HttpPost] 
    public ActionResult ViewProfile() 
    { 
     ... 
     string emailAddress = this.userInformation.EmailAddress; 
     ... 
    } 
}