如何关闭整个ASP.NET MVC 3网站的缓存?

9

就像问题所说的那样,我想知道是否可以在整个网站上关闭所有控制器和操作的缓存。谢谢!

4个回答

15
创建一个全局的 Action 过滤器并重写 OnResultExecuting() 方法:
public class DisableCache : 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();
    }
}
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new DisableCache());
    }

总的来说,这将创建一个全局操作过滤器,因此隐式地应用于所有控制器和所有操作。


谢谢您的回复。脚本、图像和CSS呢?全局操作过滤器是否也会影响它们?换句话说,一个操作过滤器只会在控制器/操作的请求中被调用,还是每个请求都会被调用?就像@AdamTuliper提到的那样,我不想缓存那些东西。 - enamrik
@enamrik 嗯...测试后发现,使用这个全局操作过滤器仍然会缓存图像和CSS。我需要研究如何防止这种情况发生。 - user596075
算了,显然这就是ActionFilter的定义,它只在请求操作时运行。 - enamrik
@enamrik 对,没错。也许这是需要在客户端处理的事情吗? - user596075
MVC4更新:此方法与捆绑和缩小很好地配合使用。HTML页面不会被缓存,但是打包的脚本和CSS等资源仍将被缓存。 - Edward Brey
显示剩余2条评论

5
你应该将此方法添加到 Global.asax.cs 文件中。
protected void Application_BeginRequest(object sender, EventArgs e)
        {
            Response.AddHeader("Cache-Control", "no-cache, no-store, must-revalidate");
            Response.AddHeader("Pragma", "no-cache"); // HTTP 1.0.
            Response.AddHeader("Expires", "0"); // Proxies.
        }

这会在每个请求中禁用缓存(图片、HTML、JS等)。


1
在web.config中,您可以添加额外的标头以随每个响应一起发送。
<configuration>
    <system.webServer>
        <httpProtocol>
          <customHeaders>
            <add name="Cache-control" value="no-cache"/>
          </customHeaders>
        </httpProtocol>
    </system.webServer>
</configuration>

1
是的,这取决于你采取的方法。 我喜欢将操作应用于基本控制器(因此在那里回答)。你可以在下面的链接中实现过滤器,并将其作为全局过滤器实施(在global.asax.cs中注册)。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接