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

Pal*_*ani 199 asp.net asp.net-mvc caching browser-cache

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

我找到了以下方法:

Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);
Response.Cache.SetNoStore();
Run Code Online (Sandbox Code Playgroud)

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

<meta http-equiv="PRAGMA" content="NO-CACHE">
Run Code Online (Sandbox Code Playgroud)

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

JKG*_*JKG 365

创建一个继承自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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后把属性放在需要的地方

[NoCache]
[HandleError]
public class AccountController : Controller
{
    [NoCache]
    [Authorize]
    public ActionResult ChangePassword()
    {
        return View();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 在当前版本的ASP.NET MVC中,您只需使用OutputCacheAttribute来阻止缓存:[OutputCache(NoStore = true,Duration = 0,VaryByParam ="None")] (102认同)
  • 您应该使用filterContext.HttpContext.Response而不是HttpContext.Current.Response,因为HttpContext.Current返回pre-MVC HttpContext对象,filterContext.HttpContext返回post-MVC HttpContextBase.它提高了可测试性和一致性. (19认同)
  • 我想指出,我花了好几天时间使用每个"把它放在你的代码中停止缓存"的解决方案,在ASP.NET MVC的阳光下解决,包括接受这个问题的答案,但无济于事.这个答案 - 属性 - 起作用了.如果可以的话,+ 1M Rep ... (9认同)
  • IActionFilter已经在ActionFilterAttribute上实现,因此您无需重复它. (5认同)
  • 您可能希望在顶部添加`if(filterContext.IsChildAction)return;` - 如果它调用使用`NoCache`属性修饰的子操作,这将阻止外部操作'无缓存'.换句话说,如果执行子操作,`NoCache`属性不会泄漏到其他操作.此外,类名应为"NoCacheAttribute",以符合通常接受的属性命名约定. (4认同)

Ada*_*SFT 132

不要自己动手,只需使用为您提供的内容即可.

如前所述,不要禁用所有内容的缓存.例如,应该缓存ASP.NET MVC中大量使用的jQuery脚本.实际上理想情况下你应该为那些人使用CDN,但我的观点是应该缓存一些内容.

我觉得这里最好用而不是在各处洒[OutputCache]就是使用一个类:

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

您要禁用缓存的所有控制器都将从此控制器继承.

如果需要覆盖NoCacheController类中的默认值,只需在操作方法上指定缓存设置,Action方法的设置优先.

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

  • @Ozziepeeps,你的评论不正确.msdn文档讨论浏览器缓存以及一个简单的测试将显示此属性将缓存控制响应头更改为"Cache-Control:public,no-store,max-age = 0",而不是"Cache-Control:private"使用该属性. (4认同)
  • 还有fyi - 您可以使用此属性控制所有三个位置(服务器,代理,客户端),因此绝对可以控制超出服务器缓存.有关其他详细信息,请参阅http://www.asp.net/mvc/tutorials/improving-performance-with-output-caching-cs. (2认同)
  • 请注意,如果在类级别使用`[System.Web.Mvc.OutputCache(NoStore = true,Duration = 0,VaryByParam ="*")]`,则不能在类中使用PartialViews. (2认同)

Squ*_*gs. 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();
Run Code Online (Sandbox Code Playgroud)

所有请求首先通过default.aspx路由 - 所以假设你可以在那里弹出代码.

  • 我会把它放在Application_BeginRequest()中的Global.asax.cs中.我不相信这个default.aspx的事情......另一个问题:这是否优先于[OutputCache]属性? (17认同)
  • 将它放在Application_BeingRequest中可能会导致一些问题.如果您的图像通过.net运行时路由(如果您使用通配符映射来获取不错的URL,则会发生这种情况),那么浏览器上不会缓存任何图像.这可以真正减慢页面加载时间,因为每个页面请求将重新下载所有图像. (13认同)
  • 我喜欢简单地创建一个全局动作过滤器的想法,以这种方式放置这些东西.否定需要担心Default.aspx和Global.asax. (5认同)
  • 以编程方式使用任何内容都将覆盖任何声明的Attribute.换句话说,使用OP的代码将覆盖任何声明的[OutputCache]属性. (4认同)

Edw*_*rey 10

您可能希望禁用由控制器(即HTML页面)呈现的所有页面的浏览器缓存,但为脚本,样式表和图像等资源保留缓存.如果您正在使用MVC4 +捆绑和缩小,则需要保留脚本和样式表的默认缓存持续时间(非常长的持续时间,因为缓存基于对唯一URL的更改而不是基于时间而变得无效).

在MVC4 +中,要禁用所有控制器上的浏览器缓存,但将其保留用于未由控制器提供的任何内容,请将其添加到FilterConfig.RegisterGlobalFilters:

filters.Add(new DisableCache());
Run Code Online (Sandbox Code Playgroud)

定义DisableCache如下:

class DisableCache : ActionFilterAttribute
{
    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
    }
}
Run Code Online (Sandbox Code Playgroud)


Car*_*z T 6

我知道这个答案并不是100%与问题相关,但它可能对某人有所帮助.

如果要为整个ASP.NET MVC网站禁用浏览器缓存,但只想暂时执行此操作,则最好在浏览器中禁用缓存.

这是Chrome中的屏幕截图