Отключить кэш браузера для всего 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">

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

161   8  

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] везде, чтобы использовать a класс:

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

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

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

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

вы можете отключить кэширование браузера для всех страниц, отображаемых контроллерами (т. е. HTML-страниц), но держите кэширование на месте для ресурсы, такие как скрипты, таблицы стилей и образов. Если вы используете MVC4+ bundling и minification, вы захотите сохранить длительность кэша по умолчанию для сценариев и таблиц стилей (очень длинные длительности, так как кэш становится недействительным на основе изменения уникального 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, а вы только хотите сделать это временно, то лучше отключить кэш в вашем браузере.

Here's a screenshot in Chrome

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

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

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

вы можете попробовать ниже код в глобальный.файл 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();
    Ничего не найдено.

Добавить ответ:
Отменить.