Тайм-аут HttpWebRequest и ReadWriteTimeout - что они означают для основного TCP-соединения? - PullRequest
22 голосов
/ 31 августа 2011

Мне кажется, я понимаю практические различия между HttpWebRequest.Timeout и HttpWebRequest.ReadWriteTimeout.Тем не менее, я ищу дополнительную ясность в отношении разницы между этими двумя тайм-аутами, включая то, что эти значения означают по отношению к базовому TCP соединению / буферам / состоянию , если применимо .

Например, используются ли эти таймауты только во время инициализации TCP-соединения, или это только управляемые значения для отслеживания неуправляемого соединения?

Каковы сценарии клиент-сервер в терминах TCP, где каждый из этих тайм-аутов будет применяться или не применяться?

Ответы [ 3 ]

15 голосов
/ 23 февраля 2012

Эта проблема обсуждалась по другому вопросу, см. Настройка времени ожидания подключения HttpWebRequest в C # . В результате обсуждения у меня закружилась голова, поэтому я предложу свое резюме.

Хотя MSDN объясняет, что свойство HttpWebRequest.Timeout применяется к HttpWebRequest.GetResponse и HttpWebRequest.GetRequestStream вызовам, описание немного сбивает с толку.

Джим Мишель более полезен: Timeout "- это время ответа сервера на запрос, а не время ожидания ответа сервера и отправки всех данных. «. Таким образом, Timeout охватывает установление рабочего соединения. Для больших полезных нагрузок это не означает, что запрос / ответ завершен.

ReadWriteTimeout применяется к операциям чтения или записи для потоков, которые передаются по соединению. Например. когда вы пишете в поток, возвращаемый GetRequestStream. Соединение уже установлено, но существует риск его разрыва. Например. сетевое соединение обрывается.

Ссылка Джима Мишеля содержит несколько очень полезных советов о том, какие значения устанавливать для этого тайм-аута. То есть значение по умолчанию для ReadWriteTimeout слишком длинное.

5 голосов
/ 19 апреля 2014

Полагаю, вы получили первую часть своего ответа от @Donal Lafferty.В любом случае вот краткое резюме.

HttpWebRequest.Timeout - время, до которого сервер должен принять запрос клиента.Обратите внимание, что это не включает время разрешения DNS, которое управляется ServicePointManager.

HttpWebRequest.ReadWriteTimeout - время, до которого клиент должен получить все тело ответас сервера.Обратите внимание, что этот тайм-аут начинается только после того, как сервер примет запрос.

Ответ на ваш второй вопрос состоит из двух частей:

1.Синхронный запрос:

Соединения TCP закрываются по тайм-ауту, все довольны.

2.Асинхронный запрос:

Эти тайм-ауты абсолютно не влияют.Если у вас нет соответствующего механизма для обработки тайм-аутов, TCP-соединения останутся открытыми.

Именно поэтому вы прервите запрос, зарегистрировав тайм-аут в AsyncWaitHandle, как показано в примерездесь:

http://msdn.microsoft.com/library/21k58ta7.aspx

4 голосов
/ 26 ноября 2013

.Timeout = время, потраченное на попытку установить соединение (не включая время поиска) .ReadWriteTimeout = время, потраченное на попытку чтения или записи данных после установления соединения

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