Эффективное значение заголовков HTTP-кэша в ASP.NET - PullRequest
3 голосов
/ 27 января 2012

Я работаю над веб-приложением в ASP.NET 2.0, которое включает обслуживание изображений через обработчик ресурсов (.ashx). Я только что реализовал обработку заголовков кэша и условных запросов GET, чтобы мне не приходилось обслуживать все изображения для каждого запроса. Но я не уверен, что полностью понимаю, что происходит с кешем браузера.

Изображения извлекаются через URL, например http://www.mysite.com/image.ashx?imageID=3. Мой код в обработчике выглядит примерно так:

int imageID = -1;
try
{
  imageID = Int32.Parse(context.Request["imageID"]);
}
catch (Exception) {}

MyImageClass image = DataLayer.GetImage(imageID);
if (image != null)
{
  DateTime requestedDate = DateTime.MinValue;
  if (context.Request.Headers["If-Modified-Since"] != null)
  {
    requestedDate = DateTime.Parse(context.Request.Headers["If-Modified-Since"])
      .ToLocalTime();
  }

  if (requestedDate < image.ModifiedDate)
  {
     context.Response.AddHeader("content-type", image.ContentType);
     context.Response.CacheControl = HttpCacheability.Private.ToString();
     context.Response.Cache.SetLastModified(image.ModifiedDate.ToUniversalTime());
     context.Response.Cache.SetMaxAge(TimeSpan.FromDays(1));
     //write image to output stream
  }
  else
  {
    context.Response.StatusDescription = "Not Modified";
    context.Response.StatusCode = 304;
  }
}

Вот как выглядит заголовок ответа при первом запросе изображения:

HTTP/1.1 200 OK
Cache-Control: private, max-age=86400
Content-Length: 1048576
Content-Type: image/jpeg
Expires: Sat, 28 Jan 2012 17:17:11 GMT
Last-Modified: Fri, 27 Jan 2012 16:50:27 GMT
Server: Microsoft-IIS/7.5
X-AspNet-Version: 2.0.50727
X-Powered-By: ASP.NET
Date: Fri, 27 Jan 2012 17:17:10 GMT

А это ответ на последующий запрос:

HTTP/1.1 304 Not Modified
Cache-Control: private
Server: Microsoft-IIS/7.5
X-AspNet-Version: 2.0.50727
X-Powered-By: ASP.NET
Date: Fri, 27 Jan 2012 17:17:30 GMT
Connection: close

Просматривая запросы в Fiddler, я замечаю, что браузер (Firefox 9) всегда делает условный запрос GET для изображения после первого запроса. Он получает ответ 304 Not Modified и извлекает изображение из кеша, и это здорово. Но разве нет способа заставить его всегда вытаскивать из кэша, даже не спрашивая сервер, пока не истечет максимальный срок действия (или срок действия) заголовка? Я пытался использовать context.Response.Cache.SetExpires() с будущей датой, и браузер все еще делает условный запрос GET.

Ответы [ 3 ]

3 голосов
/ 27 января 2012

Когда вы нажимаете F5 или перезагружаете, Firefox всегда будет отправлять условные запросы.

Если вы переходите на страницу обычным образом (например, нажимаете на ссылку или используете адресную строку), онапойдет прямо в кеш.

2 голосов
/ 27 января 2012

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

Вы должны принять во внимание все возможности, которые предоставляет HTTP. У вас отсутствует одна концепция: e-tag .

Вы должны добавить все эти заголовки HTTP-запроса в дополнение к истечению срока действия и т. Д .:

If-Match
If-Modified-Since
If-None-Match
If-Range
If-Unmodified-Since

Я бы просто оставил это для рамок, чтобы сделать это.

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

UPDATE

Посмотрите на этот образец .

0 голосов
/ 27 января 2012

Нет HTTP-заголовка, гарантирующего любое поведение кэширования.

Заголовок Expires указывает клиенту дату, до которой все запросы к одному и тому же URI не имеют смысла. Но любой HTTP-клиент может подчиниться и не может.

Кроме того, когда вы нажимаете F5 или Обновить или Обновить, практически любой браузер запрашивает все ресурсы страницы.

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