Подтвердить что ты не робот

HttpWebRequest Timeout и ReadWriteTimeout. Что это значит для базового TCP-соединения?

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

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

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

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

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

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

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

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

Ответ 3

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

Ответ 4

Предыдущие ответы предлагают изменить ReadWriteTimeout и время ожидания. Здесь вам нужна функция переопределения Webclient.

        protected override WebRequest GetWebRequest(Uri address)
        {
            _request = base.GetWebRequest(address);

            var httpRequest = _request as HttpWebRequest;
            httpRequest.ReadWriteTimeout = 600000;
            httpRequest.Timeout = 600000;
            httpRequest.ContinueTimeout = 600000;
            if (_request != null)
            {
                httpRequest.AllowAutoRedirect = AutoRedirect;
                httpRequest.CookieContainer = CookieContainer;
                httpRequest.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;

                Setup?.Invoke(httpRequest);
            }

            return _request;
        }