2012-11-23 20 views

回答

0

如果您正在手動讀取和寫入緩存,usr的答案是正確的。但是,使用OutputCacheAttribute不能直接控制緩存鍵。

請注意,OutputCacheAttribute在其實現中仍依賴緩存鍵。在ASP.NET中,緩存的每個項目都被分配了一個通過它查找的關鍵字。

當您調用具有OutputCacheAttribute,的控制器操作時,根據您的請求生成緩存密鑰;例如,如果您有一些VaryByParam指定,緩存鍵可能因每個用戶而異。然後,您的操作返回的響應將存儲在該鍵下的緩存中。

當下一個請求進入時,會生成緩存密鑰,然後我們檢查緩存以查看是否已有緩存在該密鑰下的東西。如果是這樣,我們只是返回;否則,我們繼續行動。

我們可以通過在緩存鍵中包含主機名來爲每個綁定設置不同的緩存。如果您使用OutputCacheAttribute,你可以重寫它允許通過主機改變緩存:

public override string GetVaryByCustomString(HttpContext context, string customVary) 
{ 
    if(customVary == "Host") 
    { 
     return context.Request.Url.Host; 
    } 
    // other behaviors here if necessary 
    return ""; 
} 

這將允許緩存鍵動態地修改,以包括通過該網站被訪問的主機名。這意味着如果你有三個不同的綁定,你將有三個不同的緩存鍵(假設沒有其他變化的參數)。

下面是如何修改控制器動作:

[MyOutputCache(VaryByParam = "None", VaryByCustom = "Host", Duration = 7200)] 
public ActionResult Index() 
{ 
    // ... 
    return View(); 
} 

通知的列入VaryByCustom = "Host",然後由你重寫OutputCacheAttribute的GetVaryByCustomString()方法看到並因此包括在緩存鍵時使用。

+1

Thanks Maxim!有用!所以我找到了一個[解釋](http://visitmix.com/writings/using-varybycustom-with-outputcache-in-asp-net-mvc-to-support-caching-for-logged-in-users)喜歡你的解釋 – DmitryBLR

+0

@DmitryBLR我很高興聽到它的幫助!祝你好運。 –

1

使用Request.Host作爲緩存鍵的一部分。

相關問題