禁用整个ASP.NET网站的浏览器缓存
禁用整个ASP.NET网站的浏览器缓存
我正在寻找一种方法来禁用浏览器缓存,在整个 ASP.NET MVC 网站中。
我找到了以下方法:
Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache); Response.Cache.SetNoStore();
还有一个元标签的方法(对我无效,因为一些 MVC 操作通过Ajax发送部分HTML/JSON,没有头、元标签)。
但我正在寻找一种简单的方法来禁用整个网站的浏览器缓存。
admin 更改状态以发布 2023年5月22日
不要自己从头开始编写,只需使用提供的内容。
正如之前提到的那样,不要禁用所有缓存。比如,在 ASP.NET MVC 中广泛使用的 jQuery 脚本应该被缓存。实际上,最好是使用 CDN(内容分发网络),但我的观点是某些内容应该被缓存。
在这里,我发现最好的方法不是在到处添加 [OutputCache],而是使用一个类:
[System.Web.Mvc.OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")] public class NoCacheController : Controller { }
然后,您想要禁用缓存的所有控制器都应该继承自该控制器。
如果您需要覆盖 NoCacheController 类中的默认值,只需在您的动作方法中指定缓存设置,该动作方法中的设置将优先。
[HttpGet] [OutputCache(NoStore = true, Duration = 60, VaryByParam = "*")] public ViewResult Index() { ... }
创建一个继承自IActionFilter类的类。
public class NoCacheAttribute : ActionFilterAttribute { public override void OnResultExecuting(ResultExecutingContext filterContext) { filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1)); filterContext.HttpContext.Response.Cache.SetValidUntilExpires(false); filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches); filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache); filterContext.HttpContext.Response.Cache.SetNoStore(); base.OnResultExecuting(filterContext); } }
然后在需要的地方放置属性...
[NoCache] [HandleError] public class AccountController : Controller { [NoCache] [Authorize] public ActionResult ChangePassword() { return View(); } }