Http请求超时问题

问题描述:

我使用VSTS 2008 + C#+ .Net 3.5开发控制台应用程序,并向另一台服务器(Windows Server 2008上的IIS 7.0)发送请求。这是我的代码。我的问题是,就像在我的代码中一样,我使用while循环来从服务器读取块。 Timeout = Timeout * 1000负责(1)打开连接到服务器的超时时间,或者(2)每次读取操作的超时时间,或者(3)while循环的总时间?Http请求超时问题

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 2009-10-21 04:56:11

  1. 超时开放到服务器的连接
+0

那么如何为每个读操作和整个读操作的while循环设置超时? – George2 2009-10-20 16:07:16

+2

“ReadWriteTimeout”属性处理#2。你必须自己追踪#3。 – David 2009-10-20 16:27:14

+0

你的意思是ReadWriteTimeout适用于我的循环中的每个读/写操作? – George2 2009-10-20 16:30:45

如从MSDN

超时是后续同步请求 与GetResponse的方法等待由毫秒 的数 作为响应,并且 GetRequestStream方法等待 流。如果在超时期限内返回的资源不是 ,则 请求将抛出一个WebException,其中 的Status属性设置为 WebExceptionStatus.Timeout。

我不确定您是否可以轻松设置超时读取操作,而不需要任何低级技巧。您使用响应对象读取的所有数据都来自网卡缓冲区,该缓冲区以您的可用网络带宽速率填充。当缓冲区为空并且没有新的数据来自发送方端点时,您将在执行读取时的某个时间点超时。

P.S.这更多的是对@Gary回答的评论,也许有人可以将它移到那里。

+0

你的意思是HttpWebRequest.Timeout只用于打开连接? – George2 2009-10-20 16:20:56

+0

我在这里有一个相关的问题,如果你可以看看,很感激。 http://*.com/questions/1598748/unable-to-connect-to-remote-server-fail-in-httpwebrequest – George2 2009-10-21 04:57:20

+1

Well Timeout用于打开连接和所有下面的同步请求。所以调用GetResponse()将超时。我怀疑GetResponse()完成后,您已经拥有了网络(卡)缓冲区中的所有必需数据。当您执行Read()操作时,实际上并不是从网络中检索位,而是缓冲区本身,因此在此阶段超时并不重要。 请注意,我不是100%确定这个s很简单,如果你的响应数据大小大于网络缓冲区,可能在你读通话的某个阶段会阻塞,直到缓冲区再次充满数据。 – Audrius 2009-10-21 08:40:44