В обработчике HTTP допустимо ли возвращать 304, когда вы знаете, что содержимое не изменится? - PullRequest
1 голос
/ 30 мая 2011

У меня настроен обработчик HTTP, который принимает параметр GUID и возвращает изображение из файловой системы.

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

Правильный ли способ сделать это для установки кода состояния 304 (без изменений) из обработчика HTTP?

Ответы [ 3 ]

2 голосов
/ 30 мая 2011

Да. Однако вы должны возвращать HTTP/304, только если запрос условный запрос . Если вы знаете, что изображение с этим URL-адресом никогда не меняется, вы можете установить очень длинную дату истечения срока действия (максимум 1 год в соответствии со спецификациями).

Кстати, RFC 2616 довольно легко читать - я предлагаю взглянуть туда, для более подробной информации.

2 голосов
/ 30 мая 2011

Я бы порекомендовал вам установить правильные заголовки ответа HTTP, чтобы указать клиентам, что содержимое не изменится и может быть кэшировано:

public void ProcessRequest(HttpContext context)
{
    var cache = context.Response.Cache;
    cache.SetCacheability(HttpCacheability.Public);
    cache.SetExpires(DateTime.Now.Add(CACHE_DURATION));
    cache.SetMaxAge(CACHE_DURATION);
    cache.AppendCacheExtension("must-revalidate, proxy-revalidate");

    byte[] buffer = ...
    context.Response.ContentType = "image/png";
    context.Response.OutputStream.Write(buffer, 0, buffer.Length);
}
0 голосов
/ 30 мая 2011

Также в дополнение к ответу @ Darin, вы встречали ETags ? Это один из распространенных способов реализации кэширования, как вы предлагаете. В первый раз, когда браузер запрашивает изображение, у вас не будет ETag, чтобы вы знали, как его обслуживать В следующий раз, когда будет сделан запрос, он предоставит ETag, который вы затем сможете использовать, чтобы узнать, нужно ли вернуть 304 или само изображение. В вашем примере вы будете проверять наличие ETag или нет.

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

...