禁用整个ASP.NET网站的浏览器缓存

14 浏览
0 Comments

禁用整个ASP.NET网站的浏览器缓存

我正在寻找一种方法来禁用浏览器缓存,在整个 ASP.NET MVC 网站中。

我找到了以下方法:

Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);
Response.Cache.SetNoStore();

还有一个元标签的方法(对我无效,因为一些 MVC 操作通过Ajax发送部分HTML/JSON,没有头、元标签)。


但我正在寻找一种简单的方法来禁用整个网站的浏览器缓存。

admin 更改状态以发布 2023年5月22日
0
0 Comments

不要自己从头开始编写,只需使用提供的内容。

正如之前提到的那样,不要禁用所有缓存。比如,在 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()
{
  ...
}

0
0 Comments

创建一个继承自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();
    }
}

0