2009-10-20 2 views
0

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

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(); 
      } 
     } 
    } 
+0

Спасибо, я позабочусь об этом с этого момента. :-) – George2

ответ

3
  1. Тайм-аут для открытого соединения с сервером
+0

Затем, как установить тайм-аут для каждой операции чтения и для цикла while для всей операции чтения? – George2

+2

Свойство «ReadWriteTimeout» обрабатывает # 2. Вы должны отслеживать # 3 самостоятельно. – David

+0

Вы имеете в виду, что ReadWriteTimeout работает для каждой отдельной операции чтения/записи в моем цикле? – George2

1

Как от MSDN:

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

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

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

+0

Вы имеете в виду HttpWebRequest.Timeout используется только для открытого соединения? – George2

+0

У меня есть связанный с этим вопрос, оцените, можете ли вы взглянуть. http://stackoverflow.com/questions/1598748/unable-to-connect-to-remote-server-fail-in-httpwebrequest – George2

+1

Well Timeout используется для открытия соединения и для всех следующих синхронных запросов. Поэтому вызов GetResponse() будет тайм-аутом. Я подозреваю, что после завершения GetResponse() у вас уже есть все необходимые данные в сетевом (карточном) буфере. Когда вы выполняете операцию Read(), вы фактически не извлекаете биты из сети, а сам буфер, поэтому тайм-аут на этом этапе не важен. Обратите внимание, что я не уверен на 100%, что это так просто, если размер данных ответа больше, чем сетевой буфер, возможно, на каком-то этапе вы будете читать, когда блок будет заполнен данными снова. – Audrius