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

时间:2009-07-21 15:52:13

标签: asp.net asp.net-mvc caching browser-cache

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

我找到了以下方法:

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

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

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

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

8 个答案:

答案 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网站禁用浏览器缓存,但您只想暂时执行此操作,则最好在浏览器中禁用缓存。

Here's a screenshot in Chrome

答案 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)

UI

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