我正在使用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中有详细介绍。