2011-03-03 74 views
5

我使用VaryByCustom建立在每個瀏覽器和每個用戶爲基礎的輸出緩存:如何在ASP.NET MVC中以每個用戶爲基礎刪除輸出緩存?

[OutputCache(Duration = 6000, VaryByParam = "*", VaryByCustom="browser;userName")] 

(我重寫GetVaryByCustomString(),使這項工作)

我需要如果可能的話,能夠移除單個用戶的輸出緩存,而不會使不同用戶的輸出緩存失效。我已閱讀HttpResponse.RemoveOutputCacheItem(),但通過刪除基於路徑的輸出緩存起作用。有沒有辦法做到這一點基於VaryByCustom字符串?

回答

0

爲什麼不讓用戶在參數中,然後它是通過VaryByParam的每個用戶。

+0

這將工作,但我不想添加一個否則不必要的查詢字符串參數。 – 2011-03-03 22:24:35

0

也許使用

Response.Cache.SetVaryByCustom(string custom); 

在一個ActionFilter的,你可以建立包括瀏覽器版本和用戶

+0

這就是我已經在做的事情。我需要的是能夠爲用戶重置緩存,即使他們正在使用相同的瀏覽器。 – 2011-03-07 13:59:50

1

您可以通過覆蓋HttpApplication.GetVaryByCustomString採取VaryByCustom屬性的優勢[OutputCache]和檢查字符串HttpContext.Current.User.IsAuthenticated.

這是我將在Global.asax.cs文件中創建的內容:

public override string GetVaryByCustomString(HttpContext context, string custom) 
    { 
     if (custom == "UserName") 
     { 
      if (context.Request.IsAuthenticated) 
      { 
       return context.User.Identity.Name; 
      } 
      return null; 
     } 

     return base.GetVaryByCustomString(context, custom); 
    } 

然後在屬性的OutputCache使用它:

[OutputCache(Duration = 10, VaryByParam = "none", VaryByCustom = "UserName")] 
public ActionResult Profiles() 
{ 
    //... 
} 

但要注意的是,用戶名應該是在這種情況下,一成不變的!

相關問題