HttpWebRequest.CachePolicy: вопросы о кешировании - PullRequest
6 голосов
/ 20 ноября 2010

Если я установлю HttpWebRequest.CachePolicy следующим образом:

var webRequest = (HttpWebRequest) WebRequest.Create(url);
var policy = new HttpRequestCachePolicy( HttpCacheAgeControl.MaxAge,
                                         TimeSpan.FromMinutes(1) );
webRequest.CachePolicy = policy;

и сделать два асинхронных запроса на один и тот же URL в один и тот же момент, что происходит со вторым запросом? Второе завершается только тогда, когда первое кэшируется, или будут выполнены 2 запроса, потому что на момент выдачи в кеше ничего не было?

Кроме того, в этом контексте, что такое кеш? Где оно живет? Получим ли мы больше контроля над этим?

Ответы [ 2 ]

5 голосов
/ 30 ноября 2010

Два таких запроса в коде .NET вызовут два таких HTTP-запроса, которые довольно легко можно проверить, просто создав что-то, что делает это, выполнив его, а затем протестировав, что происходит на сервере.

Это уместно, поскольку может случиться так, что два запроса получат разные ответы, особенно если учесть, что в одном из них может возникнуть ошибка, а в другом нет.Существуют и другие причины (например, сервер может отправлять ответ, который каждый раз отличается, вместе с инструкциями о том, что его не следует кэшировать).

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

Из-за этого вполне возможно, что один из двух запросов будет отложен, поскольку он находится в очереди из-за этого правила.Даже если предел по умолчанию увеличен, возможно, что этот предел все еще превышен.

Теперь, как отмечает Марк, ответ может быть кэширован, как только его поток ответов будет прочитан до конца *, и это могло произойтико времени начала второго запроса, который приведет к использованию кэшированного ответа, если это применимо (ответ был кэширован, и при его загрузке не было ошибок).

Таким образом, в итоге мы ожидаем, что он будетдве отдельные загрузки, и мы должны этому радоваться (в случае, если одна имеет ошибку), но существуют возможные условия, при которых будет только одна загрузка, так как два «одновременных» запроса вынуждены фактически не быть одновременными.

* На самом деле, хотя в документации говорится, что поток должен быть прочитан до конца, он фактически должен быть прочитан до конца и закрыт, либо вручную, удалив его (например, из using)) или из выполняемого финализатора.

2 голосов
/ 20 ноября 2010

Во-первых, HttpWebRequest задокументировано и задокументировано как способное выполнять только один асинхронный запрос за раз (повышая InvalidOperationException), поэтому вам потребуется два таких запроса. Если бы вы выдвинули два таких запроса одновременно, я бы полностью ожидал, что оба пойдут на сервер - не было бы никаких причин не делать этого. В частности :

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

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

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

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