2012-03-20 84 views
1

我緩存使用緩存配置文件的一些頁面的服務器上的不同版本,對於不同的版本我使用VaryByCustom參數witch被重載並返回一個版本註冊用戶和另一個共同一。事實證明,我的註冊用戶很快就會在頁面上看到非常不同的信息。我的問題是有可能說如果用戶是註冊用戶而不是緩存任何東西?高速緩存只爲定期不爲註冊用戶ASP.NET MVC

+0

當你說「註冊」,你的意思是「目前登錄」? – danludwig 2012-03-20 19:27:34

+0

是的,這就是我的意思,即使是某些類型的用戶甚至都不重要(用戶根據他們有或沒有角色的不同而有所不同) – 2012-03-21 09:38:18

回答

1

你可以試試這個:

public override string GetVaryByCustomString(HttpContext context, string custom) 
{ 
    if ("User".Equals(custom, StringComparison.OrdinalIgnoreCase)) 
    { 
     if (!string.IsNullOrWhiteSpace(Thread.CurrentPrincipal.Identity.Name)) 
      return Guid.NewGuid().ToString(); // do not cache anything 
     return string.Empty; // cache for non-signed-in users 
    } 
    return base.GetVaryByCustomString(context, custom); 
} 

回覆評論

GUID是全局唯一標識符。每次你調用Guid.NewGuid().ToString(),你都會得到一個非常獨特的字符串。 從技術上講,結果仍然會被緩存,但是它將使用唯一字符串進行緩存。所以,2個登錄用戶看到相同的緩存結果的機會非常低。事實上,相同的登錄用戶會看到該頁面的緩存結果的機會相同。

如果您不想緩存任何內容,另一種方法是手動實現緩存。但是,我不認爲您可以通過使用OutputCacheAttribute來告訴操作方法「緩存非登錄用戶,但不緩存已登錄用戶」。

+0

謝謝我會試試這個,它不僅僅是明確的對我來說,爲什麼他不會緩存任何東西,當你說:return Guid.NewGuid()。ToString(); – 2012-03-21 09:44:25

+0

謝謝,也許最好的選擇是緩存每個用戶不同版本的方式,至少我不會徒勞地使用內存。再次感謝。 – 2012-03-21 12:28:47

+1

是的,這就是我們所做的 - 從''User''字符串的'GetVaryByCustomString'覆蓋中返回'Thread.CurrentPrincipal.Identity.Name'。這樣,每個用戶都可以獲得他們自己的緩存版本的頁面,並且匿名用戶都共享一個單獨的緩存版本。 – danludwig 2012-03-21 12:39:16

0

事實證明,你可以停止登錄用戶的緩存,通過實施自定義緩存提供商的巫婆,你可以在添加,設置,刪除方法防止緩存任何東西。您也可以通過global.asax中的用戶非常緩存提供程序。唯一的原因是我從來沒有使用過這種方法,我仍然需要爲用戶緩存一些頁面,並且我沒有找到方法來發現緩存提供程序類中的當前緩存配置文件,以便我可以緩存或不緩存基於個人資料。如果出於某種原因,您只是想防止在每個頁面上對已簽名用戶進行緩存,我認爲這是更好的方法,然後根據使用GUID的自定義方法進行更改。