Настройка OutputCache с помощью фильтра действий (Asp.Net MVC 4.6) - PullRequest
1 голос
/ 12 апреля 2019

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

Интернет.config содержит

  <outputCacheProfiles>
      <add name="ServerAndClientDefault" duration="86400" location="ServerAndClient" varyByParam="none"/>
  </outputCacheProfiles>

Если я использую

[OutputCache (CacheProfile = "ServerAndClientDefault")]

все работает нормально, заголовки ответа показывают

Контроль кэша: частный, максимальный возраст = 86385

Срок действия истекает: сб, 13 апреля 2019 15:42:59 GMT

Варьируется: *

Для отмены изменения* и чтобы добавить 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")]

Теперь заголовки всегда:

Cache-Control: no-cache, no-store, must-revalidate

Срок действия: -1

Pragma: no-cache

В отладчике VS я вижу правильные значения, взятые из профиля, но они, очевидно, не установлены должным образом,Также не добавлен заголовок E-Tag.Непосредственная установка жестко запрограммированных значений также не работает.

Я также пытался использовать OnActionExecuted, заменяя «ed» на «ing» (например, OnActionExecuting) и наследуя от OutputCacheAttribute вместо ActionFilterAttribute.Где-то я читал об использовании рефлексии, но на самом деле я не хочу идти по этому пути из-за страха влияния на производительность.

Это должно быть просто, и нигде больше нет настроек кэша, так почему это происходитфильтр не работает?Любая помощь очень ценится.

Редактировать

Для полноты, вот что я попытался получить из OutputCacheAttribute:

public class OutputCacheProfileAttribute : OutputCacheAttribute
{
    public OutputCacheProfileAttribute()
    {
        Duration = 86400;
        NoStore = false;
        Location = OutputCacheLocation.ServerAndClient;
    }
}

Кроме того, втот же класс, который я попытался переопределить OnActionExecuted с тем же кодом, как показано в верхней части.Ни одна из них не сработала.

Есть идеи у кого-нибудь?

...