我们正在加载测试一个简单的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);
}
}
我们发现此链接: Is async HttpClient from .Net 4.5 a bad choice for intensive load applications?
我们认为这可能是问题...
答案 0 :(得分:3)
这可能不是WebAPI的限制;相反,TCP堆栈如何处理连接池的问题。实际上,TCP堆栈对可以创建的“Ephermeral”端口的数量有限制,大约5,000。您可以修改注册表以调整MaxUserPort
值。见http://support.microsoft.com/kb/196271
1.启动注册表编辑器。
2.在注册表中找到以下子项,然后单击“参数”: HKEY_LOCAL_MACHINE \ SYSTEM \ CURRENTCONTROLSET \服务\ TCPIP \参数
3.在“编辑”菜单上,单击“新建”,然后添加以下注册表项:值名称:MaxUserPort
值类型:DWORD值数据:65534有效范围:5000-65534(十进制) 默认值:0x1388(十进制5000)
话虽如此,这可能是一个需要审核的代码段,因为可能有更好的方法来完成您的任务,而不是从单个客户端同时生成多个连接到服务器。