2010-06-08 4 views
7

Я использую кэширование вывода в моем персонализированного обработчика HTTP следующим образом:Кэширование вывода в HTTP Handler и SetValidUntilExpires

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-ответа обработчик на сервере?

ответ

18

Я нашел причину. Параметр строки запроса используется в моем 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; 

для изменения по всем параметрам.

+0

Спасибо, что нашли это решение, работали для меня с однозначными параметрами запроса. Но когда у меня есть многозначный параметр, такой как '? Id = 1 & id = 2 & id = 3', это все равно не работает. Я еще не знаю, почему, но хотел сообщить другим об этом. – Oliver

0

Общая кешируемость зависит от браузера пользователя или прокси-сервера, который указывает, что ответ кэшируется клиентами и совместно используемыми (прокси-серверами) кэшами.

бы вы пытались использовать HttpCacheability.Server

http://msdn.microsoft.com/en-us/library/system.web.httpcacheability(v=VS.71).aspx

+0

Я пробовал, но в этом случае кеширование не работает вообще. Я использую сервер разработки ASP.NET. – mayor

Смежные вопросы