Проблема с тайм-аутом HTTP-запроса

Я использую VSTS 2008 + C # + .Net 3.5 для разработки консольного приложения и отправляю запрос на другой сервер (IIS 7.0 в Windows Server 2008). Вот мой код. Мой вопрос в том, что, как и в моем коде, я использую цикл while для чтения фрагментов с сервера. Запрос тайм-аута. Timeout = Timeout * 1000 отвечает за (1) тайм-аут для открытого соединения с сервером, или (2) тайм-аут для каждой операции чтения, или (3) общее время, используемое для цикла while?

    static void PerformanceWorker()
    {
        Stream dataStream = null;
        HttpWebRequest request = null;
        HttpWebResponse response = null;
        StreamReader reader = null;
        try
        {
            request = (HttpWebRequest)WebRequest.Create(TargetURL);
            request.Timeout = Timeout * 1000;
            request.Proxy = null;
            response = (HttpWebResponse)request.GetResponse();
            dataStream = response.GetResponseStream();
            reader = new StreamReader(dataStream);

            // 1 M at one time
            char[] c = new char[1000 * 10];

            while (reader.Read(c, 0, c.Length) > 0)
            {
                globalCounter++;
            }
        }
        catch (Exception ex)
        {
            lock (counterLock)
            {
                globalFailCounter++;
                Console.WriteLine("Fail Counter: " + globalFailCounter + "\n" + ex.Message + "\n" + ex.StackTrace);
            }
        }
        finally
        {
            if (null != reader)
            {
                reader.Close();
            }
            if (null != dataStream)
            {
                dataStream.Close();
            }
            if (null != response)
            {
                response.Close();
            }
        }
    }

person George2    schedule 20.10.2009    source источник
comment
Спасибо, с этого момента я позабочусь об этом. :-)   -  person George2    schedule 21.10.2009


Ответы (2)


  1. Тайм-аут для открытого подключения к серверу
person Gary    schedule 20.10.2009
comment
Тогда как установить тайм-аут для каждой операции чтения и цикла while для всей операции чтения? - person George2; 20.10.2009
comment
Свойство ReadWriteTimeout обрабатывает №2. Вы должны сами пройти трек №3. - person David; 20.10.2009
comment
Вы имеете в виду, что ReadWriteTimeout работает для каждой отдельной операции чтения / записи в моем цикле? - person George2; 20.10.2009
comment
У меня есть связанный с этим вопрос, ценю, если бы вы могли взглянуть. stackoverflow .com / questions / 1598748 /. - person George2; 21.10.2009

Начиная с MSDN:

Тайм-аут - это количество миллисекунд, в течение которых последующий синхронный запрос, сделанный с помощью метода GetResponse, ожидает ответа, а метод GetRequestStream ожидает поток. Если ресурс не возвращается в течение периода ожидания, запрос генерирует исключение WebException со свойством Status, установленным на WebExceptionStatus.Timeout.

Я сомневаюсь, что вы можете легко установить тайм-аут для операции чтения без каких-либо уловок низкого уровня. Все данные, которые вы читаете с помощью объекта ответа, поступают из буфера сетевой карты, который заполняется в соответствии с доступной пропускной способностью вашей сети. В какой-то момент вы столкнетесь с тайм-аутом при выполнении чтения, когда буфер пуст и новые данные не поступают из конечной точки отправителя.

P.S. это скорее комментарий к ответу @Gary, возможно, кто-то сможет переместить его туда.

person Audrius    schedule 20.10.2009
comment
Вы имеете в виду, что HttpWebRequest.Timeout используется только для открытого соединения? - person George2; 20.10.2009
comment
У меня есть связанный с этим вопрос, ценю, если бы вы могли взглянуть. stackoverflow .com / questions / 1598748 /. - person George2; 21.10.2009
comment
Well Timeout используется для открытия соединения и для всех последующих синхронных запросов. Таким образом, вызов GetResponse () приведет к тайм-ауту. Я подозреваю, что после завершения GetResponse () у вас уже есть все необходимые данные в сетевом (карточном) буфере. Когда вы выполняете операцию Read (), вы фактически получаете не биты из сети, а сам буфер, поэтому тайм-аут на этом этапе не важен. Обратите внимание, что я не на 100% уверен, что это так просто, если размер данных вашего ответа больше, чем сетевой буфер, возможно, на каком-то этапе вы читаете вызов, который заблокируется до тех пор, пока буфер не будет снова заполнен данными. - person Audrius; 21.10.2009