ASP.NET MVC2 Кэширование браузера с кодом состояния HTTP304 - PullRequest
2 голосов
/ 03 октября 2011

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

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

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

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

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

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

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

1 Ответ

3 голосов
/ 03 октября 2011

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

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

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

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

Затем опубликуйте это в своем блоге.:)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...