如何在MVC4中实现在浏览器点击后退按钮时清除浏览器缓存?

24

我知道这是stackoverflow上一个常见的问题。我已经查看了每一个相同的问题,但是我无法找到适合我的正确答案。 这是我的注销控制器Action结果

    [Authorize]       
    public ActionResult LogOut(User filterContext)
    {
        Session.Clear();
        Session.Abandon();
        Session.RemoveAll();
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1));
        Response.Cache.SetNoStore();
        FormsAuthentication.SignOut();
        return RedirectToAction("Home", true);

    }

对我没用。 我还尝试添加-

<meta http-equiv="Cache-Control" content="no-cache" /> <meta http-equiv="Pragma" content="no-cache"/> <meta http-equiv="Expires" content="0"/>

这些都没有解决我的问题。


1
回到哪里?任何地方?还是只有特定的操作? - Mathew Thompson
2个回答

51
您的方法存在问题,原因是您在MVC无法应用时进行了设置。您代码中的以下三行应该放在显示视图(即页面)的方法中,也就是您不想显示的那个方法中。
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1));
Response.Cache.SetNoStore();
如果您想在所有页面上应用“浏览器返回时不缓存”的行为,那么您应该将其放在global.asax中。

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

4
为什么这个方案没有被接受并且为什么没有更多人点赞?经过数小时的谷歌搜索,这是唯一一个在所有浏览器上都可行的解决方案。 - Paul T Davies
3
先生,你今天是我的英雄。 - Saturnix
1
这将影响MVC应用程序中bundles的概念,js和css文件将不会被缓存,每次重新加载或返回时,js和css文件都将再次从服务器加载,而不是从浏览器缓存中加载。 - Sajjad Ali Khan

14

只需在操作上设置输出缓存。我在许多项目中都使用了这种方法:

[HttpGet, OutputCache(NoStore = true, Duration = 1)]
public ActionResult Welcome()
{
    return View();
}

如果用户导航回到你的视图,上述属性基本上会指示浏览器从你的控制器操作获取页面的新副本。

你还可以在web.config中定义缓存,并与此属性一起使用以避免一些重复。请参见这里


这真的帮了我很多。如果您想缓存静态文件/图像等,但不想缓存页面(视图),则此解决方案最适合这种情况。 - mmushtaq

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