200

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

我找到了以下方法:

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

还有一个元标记方法(它对我不起作用,因为一些 MVC 操作通过 Ajax 发送部分 HTML/JSON,没有头部元标记)。

<meta http-equiv="PRAGMA" content="NO-CACHE">

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

4

8 回答 8

369

创建一个继承自 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();
    }
}
于 2009-11-10T01:28:50.907 回答
132

而不是自己滚动,只需使用为您提供的内容。

如前所述,不要禁用所有内容的缓存。例如,应该缓存在 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()
{
  ...
}
于 2011-04-05T01:57:07.127 回答
93
HttpContext.Current.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
HttpContext.Current.Response.Cache.SetValidUntilExpires(false);
HttpContext.Current.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
HttpContext.Current.Response.Cache.SetNoStore();

所有请求都首先通过 default.aspx 进行路由 - 所以假设您可以在后面插入代码。

于 2009-07-21T16:00:59.720 回答
10

您可能希望对控制器呈现的所有页面(即 HTML 页面)禁用浏览器缓存,但对脚本、样式表和图像等资源保持缓存。如果您使用 MVC4+ 捆绑和缩小,您需要保留脚本和样式表的默认缓存持续时间(非常长的持续时间,因为缓存会根据对唯一 URL 的更改而不是基于时间而失效)。

在 MVC4+ 中,要禁用跨所有控制器的浏览器缓存,但保留它以用于控制器未提供的任何内容,请将其添加到FilterConfig.RegisterGlobalFilters

filters.Add(new DisableCache());

定义DisableCache如下:

class DisableCache : ActionFilterAttribute
{
    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
    }
}
于 2013-03-28T02:44:31.383 回答
6

我知道这个答案与问题不是 100% 相关,但它可能对某人有所帮助。

如果您想禁用整个 ASP.NET MVC 网站的浏览器缓存,但您只想暂时执行此操作,那么最好禁用浏览器中的缓存。

这是 Chrome 中的屏幕截图

于 2013-03-18T13:02:49.120 回答
2

我实施了所有先前的答案,但仍然有一个无法正常工作的视图。

原来,我遇到问题的视图的名称被命名为“最近”。显然这混淆了 Internet Explorer 浏览器。

在我将视图名称(在控制器中)更改为不同的名称(我选择“Recent5”)后,上面的解决方案开始起作用。

于 2013-02-27T17:07:31.730 回答
0

您可以在 Global.asax 文件中尝试以下代码。

protected void Application_BeginRequest()
    {
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1));
        Response.Cache.SetNoStore();
    }
于 2017-11-08T09:19:29.410 回答
-1

用户界面

<%@ OutPutCache Location="None"%>
<%
    Response.Buffer = true;
    Response.Expires = -1;
    Response.ExpiresAbsolute = System.DateTime.Now.AddSeconds(-1);
    Response.CacheControl = "no-cache";
%>

背景

Context.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
Response.Expires = -1;          
Response.Cache.SetNoStore();
于 2013-09-10T03:38:37.060 回答