Asp.net-Mvc
如何在 ASP.NET MVC 中為經過身份驗證的使用者關閉輸出記憶體?
我有一個 ASP.NET MVC 應用程序。我需要記憶體一些頁面,但僅適用於未經身份驗證的使用者。
我嘗試使用
VaryByCustom="user"以下GetVaryByCustomString實現:public override string GetVaryByCustomString(HttpContext context, string custom) { if (custom == "user") { if (context.User.Identity.IsAuthenticated) { return context.User.Identity.Name; } else { return ""; } } return base.GetVaryByCustomString(context, custom); }然而,這並不是我所需要的,因為頁面仍然被記憶體。唯一不同的是 now 是分別為每個使用者記憶體的。
一種可能的解決方案是在
Guid.NewGuid()每次使用者通過身份驗證時返回,但這對我來說似乎是一種巨大的資源浪費。那麼你對我有什麼建議嗎?
所以這就是我所做的:
public class NonAuthenticatedOnlyCacheAttribute : OutputCacheAttribute { public override void OnResultExecuting(ResultExecutingContext filterContext) { var httpContext = filterContext.HttpContext; if (httpContext.User.Identity.IsAuthenticated) { // it's crucial not to cache Authenticated content Location = OutputCacheLocation.None; } // this smells a little but it works httpContext.Response.Cache.AddValidationCallback(IgnoreAuthenticated, null); base.OnResultExecuting(filterContext); } // This method is called each time when cached page is going to be // served and ensures that cache is ignored for authenticated users. private void IgnoreAuthenticated(HttpContext context, object data, ref HttpValidationStatus validationStatus) { if (context.User.Identity.IsAuthenticated) validationStatus = HttpValidationStatus.IgnoreThisRequest; else validationStatus = HttpValidationStatus.Valid; } }非常感謝Craig Stuntz,他為我指出了正確的方向,但我無意中否決了他的回答。