我们正在对一个简单的ASP.NET MVC Web API应用程序进行负载测试。当我们通过6个线程每秒发送几百个请求(我们的超时设置为5秒)时,我们会遇到以下异常之一:
"System.Threading.Tasks.TaskCanceledException A task was canceled"
或者
"InnerException {"An error occurred while sending the request."}
System.Exception {System.Net.Http.HttpRequestException}
InnerException {"Unable to connect to the remote server"}
System.Exception {System.Net.WebException}
InnerException {"An operation on a socket could not be performed
because the system lacked sufficient buffer space or because a queue was full"}
System.Exception {System.Net.Sockets.SocketException}".
在执行请求时,我们注意到在某些阶段执行速度会减慢,并且会出现异常。我们猜测第一个错误与超时有关。我们怀疑另一个错误可能是由于Web API应用程序的连接限制所致。
我们有一个WCF应用程序,我们也向它发送了尽可能多的请求,这不会造成任何问题。
这两个应用程序都托管在同一台计算机上的IIS 7上。
MVC Web API中的连接数是否有限制?那和WCF处理连接的方式之间有区别吗?
编辑:
客户端代码:
for (int i = 0; i < 20000; i++)
{
try
{
const string _mediaTypeHeaderValue = "application/json";
var _serialisedRequest = "json request";
var _content = new StringContent(_serialisedRequest);
_content.Headers.ContentType = new MediaTypeHeaderValue(_mediaTypeHeaderValue);
using (var _httpClient = new System.Net.Http.HttpClient())
{
_httpClient.Timeout = new TimeSpan(0, 0, 5);
Console.WriteLine(i);
var _responseMessage = _httpClient.PostAsync("url", _content).Result;
if (_responseMessage.StatusCode != HttpStatusCode.OK)
{
var stringResult = _responseMessage.Content.ReadAsStringAsync().Result;
}
}
}
catch (Exception genericException)
{
Console.WriteLine(genericException.InnerException);
}
}
我们发现此链接:对于密集负载应用程序,.Net 4.5中的异步HttpClient是否是错误的选择?
我们认为这可能是问题所在...
这可能不是WebAPI中的限制。相反,TCP堆栈如何处理连接池的问题。实际上,TCP堆栈对可创建的“外围”端口的数量有限制,大约为5,000。您可以修改注册表以调整MaxUserPort
值。请参阅http://support.microsoft.com/kb/196271
1.启动注册表编辑器。
2.在注册表中找到以下子项,然后单击“参数”:HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters
3.在“编辑”菜单上,单击“新建”,然后添加以下注册表项:值名称:MaxUserPort
值类型:DWORD值数据:65534有效范围:5000-65534(十进制)默认值:0x1388(5000十进制)
话虽如此,这可能是一个值得回顾的代码段,因为与从单个客户端同时产生与服务器的多个连接相比,完成任务的方法可能更好。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句