Отключить кеш браузера для всего сайта 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">
Но я ищу простой способ отключить кеш браузера для всего сайта.
8 ответов
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 - при условии, что вы можете просто вставить туда код.
Создайте класс, который наследуется от 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();
}
}
Вместо того, чтобы кататься самостоятельно, просто используйте то, что предоставлено для вас.
Как упоминалось ранее, не отключайте кэширование для всего. Например, сценарии 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()
{
...
}
Возможно, вы захотите отключить кэширование в браузере для всех страниц, отображаемых контроллерами (например, 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);
}
}
Я знаю, что этот ответ не на 100% связан с вопросом, но он может кому-то помочь.
Если вы хотите отключить кэш браузера для всего веб-сайта ASP.NET MVC, но хотите сделать это ВРЕМЕННО, то лучше отключить кэш в вашем браузере.
Я реализовал все предыдущие ответы и все еще имел одно представление, которое не работало правильно.
Оказалось, что имя представления, с которым у меня возникла проблема, было названо "Недавние". Видимо это смутило браузер Internet Explorer.
После того, как я изменил имя представления (в контроллере) на другое имя (я выбрал "Recent5"), вышеприведенные решения начали работать.
Вы можете попробовать приведенный ниже код в файле Global.asax.
protected void Application_BeginRequest()
{
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1));
Response.Cache.SetNoStore();
}
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();