SetLastModified игнорируется при использовании OutputCacheAttribute - PullRequest
4 голосов
/ 09 февраля 2011

У меня есть метод ASP.NET MVC (v3.0 в .NET 4.0), настроенный следующим образом:

[OutputCache(Duration = 31536000, Location = OutputCacheLocation.Any)]
public virtual ActionResult Item()
{
    this.Response.Cache.SetLastModified(new DateTime(2011, 01, 01));
    return this.Content("hello world", "text/plain");
}

Я ожидаю, что это вернется с Last-Modifiedзаголовок установлен на Mon, 07 Feb 2011 00:00:00 GMT, как указано, однако он фактически возвращается как дата, когда выходные данные были впервые кэшированы в кэше вывода (т. е. при первом вызове метода после сброса IIS).

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

Есть идеи, почему это так?И есть ли способ заставить его использовать мое указанное значение в качестве Last-Modified даты?

Ответы [ 2 ]

2 голосов
/ 18 марта 2011

Ну, я никогда не выяснял причину, по которой это происходит, но это похоже на ошибку где-то в инфраструктуре кэширования страниц ASP.NET, которую использует атрибут [OutputCache].

В итоге я написал собственный атрибут [HttpCache] с почти таким же общедоступным интерфейсом, который вызывает соответствующие методы кэширования объекта Response.Cache напрямую, а не делегирует инфраструктуру кэширования страниц ASP.NET.

Это прекрасно работает. Обидно, что встроенный атрибут этого не делает.

0 голосов
/ 28 марта 2014

Во время события Controller OnResultExecuting [OutputCache] создает экземпляр System.Web.UI.Page для обработки свойств кэша, указанных в атрибуте.Они делают это, потому что у Page уже есть логика для преобразования OutputCacheParameters в фактические директивы кэширования http.

https://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Mvc/OutputCacheAttribute.cs

    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        if (filterContext == null)
        {
            throw new ArgumentNullException("filterContext");
        }

        if (!filterContext.IsChildAction)
        {
            // we need to call ProcessRequest() since there's no other way to set the Page.Response intrinsic
            using (OutputCachedPage page = new OutputCachedPage(_cacheSettings))
            {
                page.ProcessRequest(HttpContext.Current);
            }
        }
    }

OutputCacheAttribute в основном копирует выходные данные из исходного обработчика (контроллера)Страница, созданная для настройки кэша.

Недостатком здесь является то, что заголовки, добавленные в исходный HttpResponse, не копируются в новый обработчик (Page).Это означает, что невозможно установить заголовки для ответа в контроллере.Страница, которая фактически обрабатывает запрос, игнорирует эти заголовки.

...