2012-07-25 56 views
5

是否可以根據會話中的某些值改變MVC中的輸出緩存?我已經閱讀了很多關於在Global.asax中使用varybycustom功能和重寫GetVaryByCustomString的知識,但會話在此時不可用。基於會話值的MVC OutputCache

public override string GetVaryByCustomString(HttpContext context, string custom) 
{ 
    if (custom == "somekey") 
     //Want to check the session here (but it isn't available). 

    return base.GetVaryByCustomString(context, custom); 
} 

我明白這是因爲直到稍後請求管道中才創建會話。

我的問題是,如果不根據用戶的會話改變緩存,頁面(根據用戶在會話中有什麼變化,具有特定於該用戶的附加HTML等)將被緩存(因爲URL是同樣),並由我們的負載均衡器,代理服務器等提供服務,然後用其他人的會話信息在頁面上提供其他請求!

該URL相同的原因是用戶作爲'客人'進來,輸入一些信息(POST),這是驗證和存儲在會話中,然後他們被重新定向回到同一頁面(現在應該基於會話數據專用於用戶)。

頁面本身應該正常緩存,因爲如果'訪客'訪問相同的URL,它應該每次都服務於相同的'標準'頁面。

可以通過這種方式改變緩存嗎?

回答

0

你應該看看「甜甜圈緩存」,但這不是ASP.NET MVC 3支持的,至少不是開箱即用的。幸運的是有人已經解決了這個問題,你看MvcDonutCaching

我讀到,ASP.NET MVC 4將包括「甜甜圈孔緩存」開箱,但我不能告訴如果它在當前的RC或不。

2

如果您想個性化每個用戶的緩存輸出,最好將位置設置爲OutputCacheLocation.Client,如下所示。更多信息here

[OutputCache(Duration=3600, VaryByParam="none", Location=OutputCacheLocation.Client, NoStore=true)] 
    public string GetName() 
    { 
     return "Hi " + User.Identity.Name; 
    }