Отключить кеш браузера для всего сайта ASP.NET - PullRequest
198 голосов
/ 21 июля 2009

Я ищу способ отключить кэш браузера для всего веб-сайта ASP.NET MVC

Я нашел следующий метод:

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

А также метод метатега (он не будет работать для меня, поскольку некоторые действия MVC отправляют частичный HTML / JSON через Ajax без заголовка, метатега).

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

Но я ищу простой способ отключить кеш браузера для всего сайта.

Ответы [ 8 ]

364 голосов
/ 10 ноября 2009

Создайте класс, который наследуется от 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();
    }
}
131 голосов
/ 05 апреля 2011

Вместо того, чтобы кататься самостоятельно, просто используйте то, что вам предоставлено.

Как упоминалось ранее, не отключайте кэширование для всего. Например, jQuery-скрипты, интенсивно используемые в ASP.NET MVC, должны быть кэшированы. На самом деле в идеале вы должны использовать 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()
{
  ...
}
92 голосов
/ 21 июля 2009
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, поэтому при условии, что вы можете просто добавить туда код

10 голосов
/ 28 марта 2013

Возможно, вы захотите отключить кэширование в браузере для всех страниц, отображаемых контроллерами (т. Е. HTML-страниц), но сохранит кэширование для ресурсов, таких как скрипты, таблицы стилей и изображения, Если вы используете связывание и минимизацию MVC4 +, вам следует сохранить длительность кэширования по умолчанию для скриптов и таблиц стилей (очень длительные, поскольку кэш становится недействительным на основании изменения уникального URL-адреса, а не на основе времени).

В MVC4 +, чтобы отключить кэширование браузера на всех контроллерах, но сохранить его для всего, что не обслуживается контроллером, добавьте это к FilterConfig.RegisterGlobalFilters:

filters.Add(new DisableCache());

Определите DisableCache следующим образом:

class DisableCache : ActionFilterAttribute
{
    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
    }
}
6 голосов
/ 18 марта 2013

Я знаю, что этот ответ не на 100% связан с вопросом, но он может кому-то помочь.

Если вы хотите отключить кеш браузера для всего веб-сайта ASP.NET MVC , но вы хотите сделать это ВРЕМЕННО, то лучше отключить кеш в вашем браузере.

Here's a screenshot in Chrome

2 голосов
/ 27 февраля 2013

Я реализовал все предыдущие ответы и все еще имел одно представление, которое не работало правильно.

Оказалось, что имя представления, с которым у меня возникла проблема, было названо «Недавние». Очевидно, это запутало браузер Internet Explorer.

После того, как я изменил имя представления (в контроллере) на другое имя (я выбрал «Recent5»), вышеприведенные решения начали работать.

0 голосов
/ 08 ноября 2017

Вы можете попробовать следующий код в файле Global.asax.

protected void Application_BeginRequest()
    {
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1));
        Response.Cache.SetNoStore();
    }
0 голосов
/ 10 сентября 2013

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();
...