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

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

我找到了以下方法:

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

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

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

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

138615 次浏览
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();

所有请求都通过默认路由。首先是Aspx -假设你可以在后面输入代码。

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

不用自己卷,只要使用提供给你的东西就可以了。

如前所述,不要对所有内容都禁用缓存。例如,jQuery脚本在ASP中大量使用。NET MVC应该被缓存。实际上,理想情况下,你应该使用CDN来处理这些内容,但我的观点是一些内容应该被缓存。

我发现最好的工作在这里,而不是到处撒[OutputCache]是使用一个类:

[System.Web.Mvc.OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
public class NoCacheController  : Controller
{
}

所有你想要禁用缓存的控制器都从这个控制器继承。

如果您需要覆盖NoCacheController类中的默认值,只需在action方法上指定缓存设置,action方法上的设置将优先。

[HttpGet]
[OutputCache(NoStore = true, Duration = 60, VaryByParam = "*")]
public ViewResult Index()
{
...
}

我实现了前面所有的答案,但仍然有一个视图不能正确工作。

原来我遇到问题的视图的名称是“Recent”。显然,这让internet Explorer浏览器感到困惑。

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

我知道这个答案与问题并不是100%相关,但它可能会帮助到一些人。

如果你想禁用完整的ASP。NET MVC网站的浏览器缓存,但你只想暂时这样做,那么最好禁用浏览器中的缓存。

Here's a截图in Chrome

你可能想要禁用所有由控制器呈现的页面(即HTML页面)的浏览器缓存,但是保持缓存在适当的位置资源,如脚本、样式表和图像. 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);
}
}

用户界面

<%@ 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();

您可以在全局中尝试下面的代码。asax文件。

protected void Application_BeginRequest()
{
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1));
Response.Cache.SetNoStore();
}