Кэширование браузера ASP.NET MVC2 с кодом состояния HTTP304

В компании, в которой я работаю, есть веб-приложение, разработанное с помощью ASP.NET MVC2 и размещенное на IIS7.

В конкретном действии мы возвращаем объект JsonResult, содержащий массив. Этот массив обновляется ежедневно; так что любой запрос, поступающий в тот же день, в конечном итоге будет с тем же ответом.

public ActionResult SomeAction(int id)
{
    // Some calculations
    return Json(resultArray, JsonRequestBehavior.AllowGet);
}

Поскольку операция требует больших затрат, мы хотели повысить производительность за счет кэширования браузера и так далее.

Я добавил заголовок кеша, поэтому мы говорим браузеру пользователя кэшировать результат до следующего обновления базы данных.

Кроме того, я хочу добавить заголовок «Последнее изменение», чтобы браузер запрашивал, был ли исходный код изменен после указанной даты.

Как это сделать? Я хочу проверить, изменена ли БД после запроса браузера даты (заголовок Last-Modified), и если он не изменен, я хочу вернуть 304, который IIS автоматически делает для статических файлов (изображения, файлы css и js и т. д.)


person SadullahCeran    schedule 02.10.2011    source источник


Ответы (1)


Добавьте правдивый заголовок Last-Modified. Если ваши данные обновляются ежедневно, вы должны знать, когда, верно?

Затем в начале метода действия добавьте проверку входящего If-Modified-Since, проанализировав эту строку даты и времени в HTTP-запросе и сравнив фактическое время последнего изменения ваших данных. Если данные не были изменены, просто вернуть 304 вручную. Если это так, сделайте то, что обычно делает метод действия.

Вы также можете (или вместо этого) вернуть ETag с вашим содержимым, значение которого должно затем изменяться всякий раз, когда изменяется содержимое.

Затем оберните все это как фильтр действий ASP.NET MVC для повторного использования.

Затем напишите об этом в своем блоге. :)

Чтобы защититься от некорректно работающих клиентов и клиентов, которые ничего не кэшируют (возможно, ваши данные загружаются приложением, а не настольным браузером), вы все равно можете сохранить результат метода действия в кэше вывода ASP.NET, чтобы избежать дорогостоящая операция. Вам, вероятно, придется VaryByCustom реализовать абсолютное истечение срока действия.

person bzlm    schedule 02.10.2011
comment
Спасибо за добрый ответ :) Я впервые посетил 58bits по ссылке, которую вы дали, вы автор сообщения в блоге? Мне просто интересно. - person SadullahCeran; 10.10.2011
comment
Неа. Это просто казалось похожим на то, что вам нужно. - person bzlm; 10.10.2011