2009-10-20 281 views
0

我使用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

回答

3
  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

1

如從MSDN

超時是後續同步請求 與GetResponse的方法等待由毫秒 的數 作爲響應,並且 GetRequestStream方法等待 流。如果在超時期限內返回的資源不是 ,則 請求將拋出一個WebException,其中 的Status屬性設置爲 WebExceptionStatus.Timeout。

我不確定您是否可以輕鬆設置超時讀取操作,而不需要任何低級技巧。您使用響應對象讀取的所有數據都來自網卡緩衝區,該緩衝區以您的可用網絡帶寬速率填充。當緩衝區爲空並且沒有新的數據來自發送方端點時,您將在執行讀取時的某個時間點超時。

P.S.這更多的是對@Gary回答的評論,也許有人可以將它移到那裏。

+0

你的意思是HttpWebRequest.Timeout只用於打開連接? – George2 2009-10-20 16:20:56

+0

我在這裏有一個相關的問題,如果你可以看看,很感激。 http://stackoverflow.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