Если вы подразумеваете под «сценарием» код в вашем 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(...)
.)