2012-02-23 15 views

ответ

15

Создание глобального фильтра действий и переопределить OnResultExecuting():

public class DisableCache : 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(); 
    } 
} 

А затем зарегистрировать это в вашем global.asax, например, так:

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

в суммировании, что это делает создать Global Action Filter, так что это косвенно будет применяться ко всем контроллерам и всем действиям.

+0

Спасибо за ответ. Как насчет скриптов, изображений и css? повлияет ли глобальный фильтр действий на них? Другими словами, фильтр действий выбирается только для запросов к контроллерам/действиям или по каждому запросу? Как и @AdamTuliper, я бы не захотел кэшировать эти – enamrik

+0

@enamrik Hmmm ... после тестирования это выглядит как изображения и css, все еще кэшированные с помощью этого глобального фильтра действий. Мне нужно исследовать, как предотвратить это. –

+0

Nevermind, по-видимому, это самое определение actionfilter, что они работают только по запросам на действия. – enamrik

1

Да, в зависимости от подхода, который вы принимаете. Мне нравится применять действия к базовому контроллеру (отсюда и мой ответ). Вы могли бы реализовать фильтр по ссылке ниже, и реализовать его в качестве глобального фильтра, а также (зарегистрировано в вашем Global.asax.cs)

Disable browser cache for entire ASP.NET website

5

Вы должны добавить этот метод к вашему Global.asax.cs файл

protected void Application_BeginRequest(object sender, EventArgs e) 
     { 
      Response.AddHeader("Cache-Control", "no-cache, no-store, must-revalidate"); 
      Response.AddHeader("Pragma", "no-cache"); // HTTP 1.0. 
      Response.AddHeader("Expires", "0"); // Proxies. 
     } 

Это отключает кэш на каждом запросе (изображения, HTML, JS и т.д.).

1

В web.config вы можете добавить дополнительные заголовки, чтобы выйти с каждым ответом

<configuration> 
    <system.webServer> 
     <httpProtocol> 
      <customHeaders> 
      <add name="Cache-control" value="no-cache"/> 
      </customHeaders> 
     </httpProtocol> 
    </system.webServer> 
</configuration>