Я использую VSTS 2008 + C # + .Net 3.5 для разработки консольного приложения и отправляю запрос на другой сервер (IIS 7.0 в Windows Server 2008). Я обнаружил, что когда количество потоков запроса велико (например, 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. Взгляните на главу 10 книги Повышение производительности и масштабируемости приложений .NET, в частности, этот раздел о подключениях.
Возможно, вам потребуется добавить такой раздел в machine.config:
<connectionManagement>
<add address="*" maxconnection="12"/>
</connectionManagement>
Что подробно описано в Библиотека MSDN.