有沒有一種簡單的方法來緩存ASP.NET整個頁面爲匿名用戶(使用窗體身份驗證)只?緩存ASP.NET頁面只
語境:我做了一個網站,顯示的匿名用戶的網頁大多是完全靜態的,但同樣的頁面顯示登錄用戶都沒有。
我當然可以通過代碼手動做到這一點落後,但我認爲有可能是一個更好/更容易/更快的方式。
有沒有一種簡單的方法來緩存ASP.NET整個頁面爲匿名用戶(使用窗體身份驗證)只?緩存ASP.NET頁面只
語境:我做了一個網站,顯示的匿名用戶的網頁大多是完全靜態的,但同樣的頁面顯示登錄用戶都沒有。
我當然可以通過代碼手動做到這一點落後,但我認爲有可能是一個更好/更容易/更快的方式。
你可以使用VaryByCustom
,並使用一鍵像username
。
這樣做的問題是它也會緩存顯示給登錄用戶的頁面。在我的情況下,這些頁面已被部分緩存,而某些部分根本無法緩存(即使是同一用戶)。 當然,如果用戶已經登錄,我可以將VaryByCustom鍵設置爲一個隨機值,但它會有巨大的性能問題。 – 2010-01-17 16:54:17
我使用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函數在未經過身份驗證時返回「匿名」或用戶名稱可用時返回。
謝謝,這爲我創造了奇蹟。 – Dusda 2012-01-17 03:31:57
沒有什麼從擴大與期望的行爲的現有屬性阻止你,
例如:
public class AnonymousOutputCacheAttribute : OutputCacheAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if(filterContext.HttpContext.User.Identity.IsAuthenticated)
return;
base.OnActionExecuting(filterContext);
}
}
沒有測試過這一點,但我不明白爲什麼這不應該」工作。
你有沒有得到解決這個問題?我們有類似的需求,因此不同的自定義不是答案。 – 2010-02-25 19:38:00
目前我使用代碼隱藏解決方案,我可以輕鬆決定是否要緩存頁面。如果用戶沒有登錄,我緩存。如果用戶已登錄,則整個頁面的緩存被禁用(並且僅緩存「靜態」部分)。 當我收到下面的答案後,我搜索了一個沒有代碼隱藏的解決方案,但沒有發現任何幫助。畢竟,一個代碼隱藏解決方案也非常清晰,並沒有比純ASP.NET更重要的缺點。 – 2010-02-26 05:03:49
你可以分享你的代碼隱藏解決方案嗎?你如何控制這樣的緩存? – 2010-02-26 18:53:07