如何禁用 ASP.NET 网站的所有的 浏览器缓存 ?

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何禁用 ASP.NET 网站的所有的 浏览器缓存 ?相关的知识,希望对你有一定的参考价值。

咨询区

  • Palani

我在寻找一个方法禁用某个 ASP.NET MVC 网站的所有浏览器缓存,我发现了如下方法。


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

而且我也发现了可以在 html 上追加一个 meta 标记。


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

但这种方式不适合我,因为我的网站中会有一些 ajax 请求,自然就无法携带meta了。

请问我如何在全局作用域下实现这么一个禁用浏览器缓存的功能?

回答区

  • JKG

可以自定义一个继承 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] 标记即可,比如下面的 Controller。


[NoCache]
[HandleError]
public class AccountController : Controller
{
    [NoCache]
    [Authorize]
    public ActionResult ChangePassword()
    {
        return View();
    }
}

  • NidhinSPradeep

你可以在  Global.asax 下的 Application_BeginRequest 方法中实现此功能。


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

  • JKG

你可以使用 Asp.NET 自带的 OutputCache 特性。


[System.Web.Mvc.OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]

直接使用 OutputCache 特性的话,会让这些代码零散在项目各处,更好的做好应该是封装到一个 Controller 中,然后让需要的 Controller 继承此 Controller 即可,比如下面的代码。


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

public class HomeController : NoCacheController
{
}

点评区

全局禁用浏览器的Cache,这需求有点奇葩哈,不过本篇也学习到了如何全局性的配置,有收获。

以上是关于如何禁用 ASP.NET 网站的所有的 浏览器缓存 ?的主要内容,如果未能解决你的问题,请参考以下文章

强制客户端浏览器重新下载我们的 asp.net Web 应用程序的 .css 和 .js 文件的优雅方式(不完全禁用缓存)

如何在 ASP.NET Core(.NET 6、VS 2022)中禁用浏览器链接

为 asp.net 网站缓存大对象

如何在 ASP.NET 中禁用 RSS

csharp ASP.net MVC:完全禁用缓存

如何禁用 ASP.NET 中某些控件的 UpdateProgress?