Настройка кэша вывода с помощью фильтра действий (Asp.Net MVC 4.6)

#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 не сработало; пожалуйста, дайте мне знать, если у вас есть конкретное предложение