向主机发送大量请求时 System.Net.HttpWebRequest.GetResponse() 的操作超时

pul*_*420 2 c# timeout operation getresponse

我正在向具有不同数据的特定 Web 服务发送大量并发请求。为了实现这一点,我创建了许多线程(大约 50 个)。每分钟的总请求数可能会增加到 10000。Windows 服务形式的应用程序可以正常运行几分钟,然后遇到操作超时错误。

我已经尝试了常见的怀疑方法,例如增加DefaultConnectionLimit、关闭 Web 响应对象。由于请求不会在服务器上花费太多时间,因此我还将请求超时ReadWriteTimeout 设置为 5 秒。下面是被不同线程重复调用的代码片段。

// Below line is executed at the start of application
ServicePointManager.DefaultConnectionLimit = 15000;

// Below code is executed at repeatedly by different threads
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
request.Host = hostName;
request.Proxy = null;
request.UserAgent = "Windows Service";
byte[] bytes = new byte[0];
if (body != null)
{
    bytes = System.Text.Encoding.ASCII.GetBytes(body);
    request.ContentType = "text/xml; encoding='utf-8'";
    request.ContentLength = bytes.Length;
}
request.Method = "POST";
request.Timeout = 5000;
request.ReadWriteTimeout = 5000;

request.Headers["Authorization"] = "Basic " + Convert.ToBase64String(Encoding.Default.GetBytes(username + ":" + password));

request.CookieContainer = this.cookieContainer;

if (body != null)
{
    Stream requestStream = request.GetRequestStream();
    requestStream.Write(bytes, 0, bytes.Length);
    requestStream.Close();
}

HttpWebResponse httpResponse = (HttpWebResponse)request.GetResponse();

using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
     responseText = streamReader.ReadToEnd();
}
httpResponse.Close();
Run Code Online (Sandbox Code Playgroud)

mjw*_*lls 5

ServicePointManager.DefaultConnectionLimit限制对给定服务器的传出 Web 请求的数量。默认值通常为2 或 10

如果您要对该 Web 服务进行 50 次并行调用,则应ServicePointManager.DefaultConnectionLimit(在应用程序启动时)将其设置为更大的数字(例如40-50)。

此外,你是不是打电话CloseDisposerequest。你应该这样做,或者让using你来照顾它。