ASP NET MVC — отключите OutputCache глобально по умолчанию

У меня есть приложение ASP.NET MVC 4. Я хотел бы вернуть заголовок ответа управления кешем с установленным по умолчанию значением «без хранения» для всех действий и разрешить некоторые исключения для конечных точек ceratin, если они должны кэшировать результаты. Для этого я попытался зарегистрировать OutputCacheAttribute в Application_Start() для всех действий со свойством NoStore, для которого установлено значение true. Затем я мог перезаписать глобальные настройки, украсив контроллеры или действия атрибутом OutputCacheAttribute, если я хотел, чтобы они кэшировали результаты. Ниже приведен упрощенный пример кода из моего приложения. Я основывал все на этом сообщении https://forums.asp.net/t/2146531.aspx?Disable+cache+in+ASPNET+MVC.

public class MvcApplication : System.Web.HttpApplication
{
   protected MvcApplication() : base()
   {
   }
 
   protected void Application_Start()
   {
      GlobalFilters.Filters.Add(new OutputCacheAttribute
      {
         VaryByParam = "*",
         Duration = 0,
         NoStore = true,
      });
   }
        
}

Однако, когда я ввожу представления, состоящие из частичных представлений, приложение выдает следующее исключение: введите здесь описание изображения

Зачем мне устанавливать продолжительность, если я даже не хочу кэшировать результаты? Также похоже, что дочерние действия не поддерживают передачу свойства NoStore: Кэширование частичного вывода страницы Asp.Net MVC 3 без учета параметров конфигурации

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

public class NoCacheGlobalAttribute : ActionFilterAttribute
{
   public override void OnResultExecuted(ResultExecutedContext filterContext)
   {
      var cache = filterContext.HttpContext.Response.Cache;
      cache.SetNoStore();
      cache.SetMaxAge(TimeSpan.FromSeconds(0));
   }
}

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


person Alienown    schedule 28.10.2020    source источник