我正在寻找一种方法来禁用整个ASP.NET MVC网站的浏览器缓存
我找到了以下方法:
Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);
Response.Cache.SetNoStore();
还有一个元标记方法(它对我不起作用,因为一些MVC动作通过Ajax发送部分HTML / JSON,没有头部元标记)。
<meta http-equiv="PRAGMA" content="NO-CACHE">
但我正在寻找一种简单的方法来禁用整个网站的浏览器缓存。
答案 0 :(得分:364)
创建一个继承自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();
}
}
答案 1 :(得分:131)
不要自己动手,只需使用为您提供的内容即可。
如前所述,不要禁用所有内容的缓存。例如,应该缓存ASP.NET MVC中大量使用的jQuery脚本。实际上理想情况下你应该为那些人使用CDN,但我的观点是应该缓存一些内容。
我觉得这里最好用的不是洒在[OutputCache]上,而是使用一个类:
[System.Web.Mvc.OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
public class NoCacheController : Controller
{
}
您要禁用缓存的所有控制器都将从此控制器继承。
如果您需要覆盖NoCacheController类中的默认值,只需在操作方法上指定缓存设置,并且Action方法的设置优先。
[HttpGet]
[OutputCache(NoStore = true, Duration = 60, VaryByParam = "*")]
public ViewResult Index()
{
...
}
答案 2 :(得分:92)
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路由所有请求 - 所以假设你可以在那里弹出代码。
答案 3 :(得分:10)
您可能希望禁用控制器(即HTML页面)呈现的所有页面的浏览器缓存,但为脚本,样式表和图像等资源保留缓存。如果您正在使用MVC4 +捆绑和缩小,则需要保留脚本和样式表的默认缓存持续时间(非常长的持续时间,因为缓存根据对唯一URL的更改而不是基于时间而变得无效)。 / p>
在MVC4 +中,要禁用所有控制器上的浏览器缓存,但要将其保留用于未由控制器提供的任何内容,请将其添加到FilterConfig.RegisterGlobalFilters
:
filters.Add(new DisableCache());
如下定义DisableCache
:
class DisableCache : ActionFilterAttribute
{
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
}
}
答案 4 :(得分:6)
我知道这个答案与问题没有100%的关系,但它可能对某人有帮助。
如果要为整个ASP.NET MVC网站禁用浏览器缓存,但您只想暂时执行此操作,则最好在浏览器中禁用缓存。
答案 5 :(得分:2)
我实施了之前的所有答案,但仍然有一个无法正常运行的视图。
原来我遇到问题的视图名称被命名为'Recent'。显然这使Internet Explorer浏览器感到困惑。
我将视图名称(在控制器中)更改为其他名称(我选择'Recent5')后,上述解决方案开始起作用。
答案 6 :(得分:0)
您可以在Global.asax文件中尝试以下代码。
protected void Application_BeginRequest()
{
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1));
Response.Cache.SetNoStore();
}
答案 7 :(得分:-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();