#c# #asp.net #asp.net-mvc-4 #caching #outputcache
#c# #asp.net #asp.net-mvc-4 #кэширование #outputcache
Вопрос:
Должно быть, я упускаю из виду что-то действительно глупое, я прочитал много сообщений об этом и опробовал различные предлагаемые решения, но почему-то я не могу заставить фильтр действий работать.
Web.config содержит
<outputCacheProfiles>
<add name="ServerAndClientDefault" duration="86400" location="ServerAndClient" varyByParam="none"/>
</outputCacheProfiles>
Если я использую
[OutputCache(CacheProfile = «ServerAndClientDefault»)]
все работает нормально, заголовки ответов показывают
Управление кэшем: частное, максимальный возраст = 86385
Истекает: Сб, 13 апр 2019 15:42:59 GMT
Изменить: *
Чтобы переопределить vary * и добавить E-Tag, я создал фильтр действий следующим образом:
public class OutputCacheProfileAttribute : ActionFilterAttribute
{
public string CacheProfileName { get; set; }
public HttpCacheability Cacheability { get; set; } = HttpCacheability.ServerAndPrivate;
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
var cache = filterContext.HttpContext.Response.Cache;
var cacheSection = (OutputCacheSettingsSection)WebConfigurationManager.GetSection("system.web/caching/outputCacheSettings");
var cacheProfile = cacheSection.OutputCacheProfiles[CacheProfileName];
base.OnResultExecuted(filterContext);
cache.SetCacheability(Cacheability);
cache.SetValidUntilExpires(false);
cache.SetExpires(DateTime.Now.AddSeconds(cacheProfile.Duration));
cache.SetMaxAge(TimeSpan.FromSeconds(cacheProfile.Duration));
cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
cache.SetETag("test");
cache.SetOmitVaryStar(true);
cache.VaryByParams.IgnoreParams = true;
}
}
Он вызывается с помощью
[OutputCacheProfile(CacheProfileName = «ServerAndClientDefault»)]
Теперь заголовки всегда
Контроль кэша: нет кэша, нет хранилища, необходимо повторно проверять
Истекает: -1
Прагма: нет кэша
В отладчике VS я вижу, что правильные значения берутся из профиля, но они, очевидно, не устанавливаются должным образом. Заголовок E-Tag также не добавлен. Установка жестко закодированных значений напрямую также не работает.
Я также попытался использовать OnActionExecuted, заменив ‘ed’ на ‘ing’ (например, OnActionExecuting) и извлекая из OutputCacheAttribute вместо ActionFilterAttribute . Где-то я читал об использовании отражения, но я действительно не хочу идти по этому пути, опасаясь влияния на производительность.
Это должно быть просто, и больше нигде нет настроек кэша, так почему же этот производный фильтр не работает? Любая помощь приветствуется.
Редактировать
Для полноты картины, вот что я пытался извлечь из OutputCacheAttribute:
public class OutputCacheProfileAttribute : OutputCacheAttribute
{
public OutputCacheProfileAttribute()
{
Duration = 86400;
NoStore = false;
Location = OutputCacheLocation.ServerAndClient;
}
}
Кроме того, в том же классе я попытался переопределить OnActionExecuted с тем же кодом, который показан вверху. Ни то, ни другое не сработало.
Есть какие-нибудь идеи?
Комментарии:
1. Посмотрите на код OutputCacheAttribute github.com/mono/aspnetwebstack/blob/master/src/System.Web.Mvc / … это поможет вам
2. спасибо, но я не вижу, что я могу с этим сделать, чего я еще не пробовал; как уже упоминалось, получение и переопределение частей OutputCacheAttribute не сработало; пожалуйста, дайте мне знать, если у вас есть конкретное предложение