2010-01-17 115 views
5

有沒有一種簡單的方法來緩存ASP.NET整個頁面爲匿名用戶(使用窗體身份驗證)只?緩存ASP.NET頁面只

語境:我做了一個網站,顯示的匿名用戶的網頁大多是完全靜態的,但同樣的頁面顯示登錄用戶都沒有。

我當然可以通過代碼手動做到這一點落後,但我認爲有可能是一個更好/更容易/更快的方式。

+0

你有沒有得到解決這個問題?我們有類似的需求,因此不同的自定義不是答案。 – 2010-02-25 19:38:00

+0

目前我使用代碼隱藏解決方案,我可以輕鬆決定是否要緩存頁面。如果用戶沒有登錄,我緩存。如果用戶已登錄,則整個頁面的緩存被禁用(並且僅緩存「靜態」部分)。 當我收到下面的答案後,我搜索了一個沒有代碼隱藏的解決方案,但沒有發現任何幫助。畢竟,一個代碼隱藏解決方案也非常清晰,並沒有比純ASP.NET更重要的缺點。 – 2010-02-26 05:03:49

+0

你可以分享你的代碼隱藏解決方案嗎?你如何控制這樣的緩存? – 2010-02-26 18:53:07

回答

1

你可以使用VaryByCustom,並使用一鍵像username

+0

這樣做的問題是它也會緩存顯示給登錄用戶的頁面。在我的情況下,這些頁面已被部分緩存,而某些部分根本無法緩存(即使是同一用戶)。 當然,如果用戶已經登錄,我可以將VaryByCustom鍵設置爲一個隨機值,但它會有巨大的性能問題。 – 2010-01-17 16:54:17

3

我使用asp.net MVC的,所以我在我的控制器這樣做

if (User.Identity.IsAuthenticated) { 
    Response.Cache.SetCacheability(HttpCacheability.NoCache); 
    Response.Cache.SetExpires(DateTime.Now.AddMinutes(-1)); 
    Response.Cache.SetNoStore(); 
    Response.Cache.SetNoServerCaching(); 
} 
else { 
    Response.Cache.VaryByParams["id"] = true; // this is a details page 
    Response.Cache.SetVaryByCustom("username"); // see global.asax.cs GetVaryByCustomString() 
    Response.Cache.SetExpires(DateTime.Now.AddSeconds(60)); 
    Response.Cache.SetCacheability(HttpCacheability.Server); 
    Response.Cache.SetValidUntilExpires(true); 
} 

我之所以這樣說(而不是聲明)是我還需要有能力打開它,並通過配置關閉(這裏沒有顯示,但是對於我的配置變量還有一個額外的檢查)。

你仍然需要通過用戶名不同,否則當一個登錄的用戶將出現,你會不會執行該代碼。我的GetVaryByCustomString函數在未經過身份驗證時返回「匿名」或用戶名稱可用時返回。

+0

謝謝,這爲我創造了奇蹟。 – Dusda 2012-01-17 03:31:57

1

沒有什麼從擴大與期望的行爲的現有屬性阻止你,

例如:

public class AnonymousOutputCacheAttribute : OutputCacheAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if(filterContext.HttpContext.User.Identity.IsAuthenticated) 
      return; 

     base.OnActionExecuting(filterContext); 
    } 
} 

沒有測試過這一點,但我不明白爲什麼這不應該」工作。