Подтвердить что ты не робот

Как добавить заголовки без кэша на сайт в приложение MVC 3

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

Можете ли вы, ребята, помочь мне?

4b9b3361

Ответ 1

Как установить Заголовки внутри события 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");
}

Ответ 2

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

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

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

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

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

HttpCacheability Enumeration

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

Ответ 3

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

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

Меньше кода - лучший код.

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

Подробнее см. здесь.

Ответ 4

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

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

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

Ответ 5

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

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