Я использую кэширование вывода в своем пользовательском обработчике HTTP следующим образом:
public void ProcessRequest(HttpContext context)
{
TimeSpan freshness = new TimeSpan(0, 0, 0, 60);
context.Response.Cache.SetExpires(DateTime.Now.Add(freshness));
context.Response.Cache.SetMaxAge(freshness);
context.Response.Cache.SetCacheability(HttpCacheability.Public);
context.Response.Cache.SetValidUntilExpires(true);
...
}
Это работает, но проблема, это обновляющее страницу с F5 приводит к регенерации страницы (вместо использования кэша) несмотря на последнюю строку кода:
context.Response.Cache.SetValidUntilExpires(true);
Какие-либо предложения?
UPD: Кажется, что причина проблемы состоит в том, что ответ обработчика HTTP не кэшируется на сервере. Следующий код работает хорошо на веб-форму, но не на обработчик:
Response.Cache.SetCacheability(HttpCacheability.Server);
Есть ли некоторые специфические особенности кэширования http ответа обработчика на сервере?
Я нашел причину. В моем URL-адресе используется параметр строки запроса, поэтому он выглядит как « http: //localhost/Image.ashx? Id = 49 ». Я думал, что если VaryByParams не установлен явно, сервер всегда будет учитывать значение параметра id, потому что context.Response.Cache.VaryByParams.IgnoreParams по умолчанию ложен. Но на самом деле сервер в этом случае вообще не использует кеш (тем не менее, браузер пользователя использует).
Итак, если в строке запроса используются параметры, Response.Cache.Параметр VaryByParams должен быть установлен явно, например
context.Response.Cache.VaryByParams.IgnoreParams = true;
для игнорирования параметров или
context.Response.Cache.VaryByParams[<parameter name>] = true;
для изменения по некоторому параметру или
context.Response.Cache.VaryByParams["*"] = true;
для изменения по всем параметрам.
публичная кэшируемость зависит от браузера пользователя или прокси он указывает, что ответ кэшируется клиентами и общими (прокси) кэшами.
пробовали ли вы использовать HttpCacheability.Server
http://msdn.microsoft.com/en-us/library/system.web.httpcacheability(v=VS.71).aspx