Windows-Server-2008

HttpWebRequest 中的“無法連接到遠端伺服器失敗”

  • October 21, 2009

我正在使用 VSTS 2008 + C# + .Net 3.5 開發控制台應用程序,並將請求發送到另一台伺服器(Windows Server 2008 上的 IIS 7.0)。我發現當請求執行緒數很大(例如 2000 個執行緒)時,客戶端在呼叫 response = (HttpWebResponse)request.GetResponse() 時會收到錯誤“無法連接到遠端伺服器失敗”。我的困惑是——我有將超時設置為一個很大的值,但我在一分鐘內收到了這樣的失敗消息。我認為即使連接真的比 IIS 可以服務的更大,客戶端也不應該這麼快收到這樣的失敗消息,它應該在超時後收到這樣的消息。任何意見?有什麼想法有什麼問題嗎?有什麼想法可以讓 IIS 7.0 提供更多的並發連接?

這是我的程式碼,

  class Program
   {
       private static int ClientCount = 2000;
       private static string TargetURL = "http://labtest/abc.wmv";
       private static int Timeout = 3600;

       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)
               {
                   Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
               }
           }
           catch (Exception ex)
           {
               Console.WriteLine(ex.Message + "\n" + ex.StackTrace);
           }
           finally
           {
               if (null != reader)
               {
                   reader.Close();
               }
               if (null != dataStream)
               {
                   dataStream.Close();
               }
               if (null != response)
               {
                   response.Close();
               }
           }
       }

       static void Main(string[] args)
       {
           Thread[] workers = new Thread[ClientCount];
           for (int i = 0; i < ClientCount; i++)
           {
               workers[i] = new Thread((new ThreadStart(PerformanceWorker)));
           }

           for (int i = 0; i < ClientCount; i++)
           {
               workers[i].Start();
           }

           for (int i = 0; i < ClientCount; i++)
           {
               workers[i].Join();
           }           

           return;
       }
   }

提前謝謝,喬治

您可能遇到了 MaxConnection 問題。看看提高 .NET 應用程序性能和可擴展性的第 10 章,特別是關於連接的這一部分。

您可能需要在 machine.config 中添加一個部分,如下所示:

<connectionManagement>
 <add address="*" maxconnection="12"/>
</connectionManagement> 

這在MSDN Library中有詳細說明。

引用自:https://serverfault.com/questions/76597