Как кэшировать изображение, возвращаемое HttpResponseMessage

1

У меня проблема с кэшированием изображений, возвращаемых HttpResponseMessage.

Доступ к файлам осуществляется по URL-адресам:

http://localhost:[service port]/[file GUID]?Adapter=[adapter type]

например:

http://localhost:59292/b9e7d18a-2eaf-11e4-92e3-8056f2d1ef7b?Adapter=CoolAdapter

Я добавляю заголовки CacheControl в HttpResponseMessage:

new CacheControlHeaderValue()
                   {
                       Public = true,
                       MaxAge = TimeSpan.FromSeconds(60)
                   };

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

Я что-то упустил (конфигурация IIS, форма url)?

Теги:
caching
http
httpresponse

2 ответа

1
Лучший ответ

Вы хотите добавить изображение в кеш IIS и задаться вопросом, почему он загружается несколько раз? Кэш IIS полезен, если у вас несколько клиентов, которым нужен один и тот же ресурс.

Вы можете проверить свой текущий кеш с помощью командной строки:

netsh http show cachestate

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

<staticContent>
    <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="1.00:00:00" />
</staticContent>
<httpProtocol>
    <customHeaders>
        <add name="Cache-Control" value="public" />
    </customHeaders>
</httpProtocol>
  • 0
    Спасибо за ответ, это помогло мне точно определить проблему. Настройка заголовков кэша работает, когда url находится в атрибуте src элемента img в html. Но выполнение URL напрямую обходит кеширование.
1

Для этого я использую следующий код:

var age = new TimeSpan(cacheTime, 0, 0);
response.Headers.CacheControl = new CacheControlHeaderValue()
{
    MaxAge = age,
    Public = false,
    NoCache = false,
    Private = true,
};
response.Content.Headers.Expires = DateTime.UtcNow.Add(age);

Не уверен, что трюк - это часть Expires, или тот факт, что я использую 24 часа в качестве времени кеша.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню