ASP.NET MVC Web API请求限制

时间:2014-10-22 15:04:27

标签: asp.net asp.net-mvc wcf

我们正在加载测试一个简单的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?

我们认为这可能是问题...

1 个答案:

答案 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)

话虽如此,这可能是一个需要审核的代码段,因为可能有更好的方法来完成您的任务,而不是从单个客户端同时生成多个连接到服务器。