Кэширование вывода в HTTP-обработчике и SetValidUntilExpires - PullRequest
7 голосов
/ 09 июня 2010

Я использую кэширование вывода в моем собственном обработчике 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 на сервере?

Ответы [ 2 ]

18 голосов
/ 09 июня 2010

Я нашел причину.В моем URL-адресе используется строковый параметр запроса, поэтому он выглядит как "http://localhost/Image.ashx?id=49".. Я думал, что если VaryByParams не задан явно, сервер всегда будет учитывать значение параметра id, поскольку context.Response.Cache.VaryByParams.IgnoreParams по умолчанию имеет значение false, но на самом деле сервер в этом случае вообще не использует кеш (тем не менее, браузер пользователя).

Итак, если параметры используются в строке запроса, Response.Cache.VaryByParams должен быть установлен явно, например

context.Response.Cache.VaryByParams.IgnoreParams = true;

для игнорирования параметров или

context.Response.Cache.VaryByParams[<parameter name>] = true;

для изменения каким-либо параметром или

context.Response.Cache.VaryByParams["*"] = true;

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

0 голосов
/ 09 июня 2010

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

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

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

...