Asp.net-Mvc

如何在 ASP.NET MVC 中為經過身份驗證的使用者關閉輸出記憶體?

  • December 18, 2014

我有一個 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,他為我指出了正確的方向,但我無意中否決了他的回答。

引用自:https://stackoverflow.com/questions/2109928