У меня есть приложение 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 так, как я описал выше? Я хочу отключить кэширование для всех действий по умолчанию и иметь возможность включить кэширование для определенных конечных точек, если захочу. Если нет, есть ли у вас какие-либо другие советы?