Как добавить заголовки без кэширования для всего сайта в приложение MVC 3 - PullRequest
22 голосов
/ 17 августа 2011

Я создал приложение MVC3, в приложении много страниц, теперь из-за проблем с безопасностью мне нужно добавить настройку без кэширования в заголовки http, есть ли какой-нибудь более простой способ сделать это? если мы можем изменить одно место, то оно будет работать для всего приложения, оно будет идеальным.

Вы, ребята, можете мне помочь?

Ответы [ 5 ]

31 голосов
/ 17 августа 2011

Как насчет установки Заголовки внутри события Application_PreSendRequestHeaders в Global.asax ?

РЕДАКТИРОВАНИЕ Вы можете использовать Response.Cache.SetCacheabilityвместо того, чтобы устанавливать заголовки напрямую. *

void Application_PreSendRequestHeaders(Object sender, EventArgs e)
{
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
}

Протестировано в Fiddler.


Альтернативный способ путем установки заголовков вручную.

void Application_PreSendRequestHeaders(Object sender, EventArgs e) {
    Response.Headers.Set("Cache-Control", "no-cache");
}
14 голосов
/ 23 ноября 2012

Альтернатива для тех, кто хочет метод / действие или класс / контроллер в ширину no-cache

[OutputCache(Location = OutputCacheLocation.None)]
public class HomeController : Controller
{
...
}

Как объяснено здесь:

Перечисление OutputCacheLocation

Нет: выходной кэш отключен для запрашиваемой страницы. Это значение соответствует значению перечисления HttpCacheability.NoCache.

Перечисление HttpCacheability

NoCache - Устанавливает заголовок Cache-Control: no-cache ....

2 голосов
/ 24 февраля 2014

Настройка глобального фильтра.

public class MvcApplication : System.Web.HttpApplication
{

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new NoCacheGlobalActionFilter());
    }    
}

public class NoCacheGlobalActionFilter : ActionFilterAttribute
{
    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache;
        cache.SetCacheability(HttpCacheability.NoCache);

        base.OnResultExecuted(filterContext);
    }
}

http://dotnet.dzone.com/articles/output-caching-aspnet-mvc

1 голос
/ 19 ноября 2012

Я рекомендую ограничить эти вызовы не-GET-запросами, чтобы не потерять преимущество кеша на GET-запросах.Следующее гарантирует, что даже агрессивные браузеры кэширования, такие как iOS 6 Safari, не будут кэшировать ничего, что не является запросом GET.

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

public class SmartController : Controller
{
    ...
    public HttpContextBase Context { get; set; }

    protected override void Initialize(System.Web.Routing.RequestContext requestContext)
    {
        Context = requestContext.HttpContext;

        if (Context.Request.RequestType != "GET")
        {
            Context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
        }

        base.Initialize(requestContext);
        ...
    }
...
}
1 голос
/ 17 августа 2011

Я бы сделал это в самом IIS (при условии, что вы используете это), или в web.config:

<configuration>
   <system.webServer>
      <staticContent>
         <clientCache cacheControlMode="DisableCache" />
      </staticContent>
   </system.webServer>
</configuration>

Меньше кода, лучше кода.

Настройка немного отличаетсяна основе версии IIS.

См. здесь для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...