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