Кэширование изображений осуществляется через скрипт - PullRequest
3 голосов
/ 22 мая 2010

У меня есть скрипт, который с помощью нескольких переменных строки запроса предоставляет изображение. Я также использую перезапись URL в IIS 7.5.

Таким образом, изображения имеют такой URL: http://mydomain/pictures/ajfhajkfhal/44/thumb.jpg или же http://mydomain/pictures/ajfhajkfhal/44.jpg

Это переписано: http://mydomain/Picture.aspx?group=ajfhajkfhal&id=44&thumb=thumb.jpg или же http://mydomain/Picture.aspx?group=ajfhajkfhal&id=44

Я добавил правила кэширования в IIS для кэширования изображений JPG, когда они запрашиваются. Это работает с моими изображениями, которые являются РЕАЛЬНЫМИ изображениями на диске. Когда изображения предоставляются через скрипт, они как-то всегда запрашиваются через скрипт, без кэширования.

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

Я использую .NET / C # 4.0 для своего сайта. Я попытался установить несколько параметров кэширования в C #, но, похоже, не могу найти, как кэшировать эти изображения (на стороне клиента), в то время как мои статические изображения кэшируются правильно.

РЕДАКТИРОВАТЬ Я использую следующие опции для кэширования изображения на стороне клиента, где 'fileName' - это физическое имя файла изображения (на диске).

context.Response.AddFileDependency(fileName);
context.Response.Cache.SetETagFromFileDependencies();
context.Response.Cache.SetLastModifiedFromFileDependencies();
context.Response.Cache.SetCacheability(HttpCacheability.Public);
context.Response.Cache.SetExpires(DateTime.Now.AddTicks(600));
context.Response.Cache.SetMaxAge(new TimeSpan(0, 5, 0));
context.Response.Cache.SetSlidingExpiration(true);
context.Response.Cache.SetValidUntilExpires(true);
context.Response.ContentType = "image/jpg";

РЕДАКТИРОВАТЬ 2 Спасибо за указание на это, это была действительно очень глупая ошибка;). Я изменил его на 30 минут (DateTime.Now.AddMinutes (30)).

Но это не решает проблему. Я действительно думаю, что проблема заключается в Firefox. Я использую Firebug для отслеживания каждого запроса и почему-то думаю, что делаю что-то в корне неправильно. Обычные изображения (кэшированные и статичные) возвращают код ответа «304 (не изменен)», а моя страница всегда возвращает «200 (ОК)».

альтернативный текст http://images.depl0y.com/capture.jpg

1 Ответ

1 голос
/ 22 мая 2010

Если вы подразумеваете под «сценарием» код в вашем Picture.aspx, я должен указать, что C # не является языком сценариев, поэтому технически это не сценарий.

Вы можете использовать Caching API, предоставляемый ASP.NET.
Я предполагаю, что у вас уже есть метод, который содержит что-то вроде этого. Вот как вы можете использовать Caching API:

string fileName = ... // The name of your file
byte[] bytes = null;

if (HttpContext.Current.Cache[fileName] != null)
{
    bytes = (byte[])HttpContext.Current.Cache[fileName];
}
else
{
    bytes = ... // Retrieve your image's bytes
    HttpContext.Current.Cache[fileName] = bytes; // Set the cache
}

// Send it to the client
Response.BinaryWrite(bytes);
Response.Flush();

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

EDIT:

Если вы хотите включить кэширование содержимого на стороне клиента, используйте следующее:

Response.Cache.SetCacheability(HttpCacheability.Public);

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

Это заставит ASP.NET отправлять клиенту правила кэширования с соответствующими заголовками HTTP.
Это не гарантирует, что клиент на самом деле его кеширует (например, это зависит от настроек браузера), но он скажет браузеру: «Вы должны кешировать это!»

Рекомендуется использовать кэширование как на стороне клиента, так и на стороне сервера.

РЕДАКТИРОВАТЬ 2:

Проблема с вашим кодом - SetExpires(DateTime.Now.AddTicks(600)). 600 тиков - это всего лишь доли секунды ... (1 секунда = 10000000 тиков)
По сути, содержимое кэшируется, но истекает в момент, когда оно попадает в браузер.

Попробуйте это:

context.Response.Cache.SetExpires(DateTime.Now.AddMinutes(5));
context.Response.Cache.SetMaxAge(TimeSpan.FromMinutes(5));

(TimeSpan.FromMinutes также более читабелен, чем new TimeSpan(...).)

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