HttpWebRequest 中出现“无法连接到远程服务器失败”

HttpWebRequest 中出现“无法连接到远程服务器失败”

我正在使用 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;
        }
    }

提前致谢,乔治

答案1

您可能遇到了 MaxConnection 问题。请查看第 10 章提高 .NET 应用程序性能和可伸缩性,特别是有关“连接”的这一部分。

您可能需要在 machine.config 中添加如下部分:

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

详细说明MSDN 库

相关内容