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

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

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

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

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

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

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

Ответ 1

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 - так что вы можете просто поместить туда код.

Ответ 2

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

Ответ 3

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

Как уже упоминалось ранее, не отключите кэширование для всего. Например, скрипты jQuery, используемые в ASP.NET MVC, должны быть кэшированы. На самом деле идеально вы должны использовать CDN для них, но моя точка зрения заключается в том, что какой-то контент следует кэшировать.

То, что я нахожу, работает лучше всего здесь, а не посыпать [OutputCache] везде, чтобы использовать класс:

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

Все ваши контроллеры, которые вы хотите отключить кеширование, затем наследуются от этого контроллера.

Если вам необходимо переопределить значения по умолчанию в классе NoCacheController, просто укажите параметры кеша в вашем методе действий, и параметры вашего метода действия будут иметь приоритет.

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

Ответ 4

Вы можете отключить кеширование браузера для всех страниц, созданных контроллерами (например, страницы 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);
    }
}

Ответ 5

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

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

Here's a screenshot in Chrome

Ответ 6

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

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

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

Ответ 7

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

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

Ответ 8

Пользовательский интерфейс

<%@ 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();