【发布时间】:2015-06-17 09:02:22
【问题描述】:
我正在尝试对 API 进行负载测试。我正在同时执行一个任务,每个任务都执行一个 HTTP 请求。我使用Task.WhenAll(mytasks) 等待所有任务完成。请求如下所示:
using (var response = await client.SendAsync(request).ConfigureAwait(false))
{
using (var jsonResponse = await response.Content.ReadAsStreamAsync().ConfigureAwait(false))
{
var jsonSerializer = new DataContractJsonSerializer(typeof(Borders));
var borders = (Borders)jsonSerializer.ReadObject(jsonResponse);
return borders;
}
}
这对至少一千个任务都有效。但是,如果我开始执行超过几千个任务,我会遇到HttpRequestExceptions:
System.Net.Http.HttpRequestException: An error occurred while sending the request. ---> System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a receive. ---> System.IO.IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host. ---> System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host
at System.Net.Sockets.NetworkStream.EndRead(IAsyncResult asyncResult)
--- End of inner exception stack trace ---
at System.Net.ConnectStream.WriteHeadersCallback(IAsyncResult ar)
--- End of inner exception stack trace ---
at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
at System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResult ar)
--- End of inner exception stack trace ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()
at BusinessLogic.<GetBorder>d__6d.MoveNext() in c:\BusinessLogic.cs:line 757
所以我的问题是:为什么会发生这种情况(超过 1000 个任务)?我怎样才能防止这种情况?我显然可以将我的任务块切成
【问题讨论】:
-
您正在使用 IIS 的 Windows 7 或 8 上进行测试?
-
异常
An existing connection was forcibly closed by the remote host可能是正在发生的事情的线索。 -
@Max:Windows Server 2008 R2;没有 IIS,我使用的是自托管的 ASP.NET Web Api
-
没有线索。由于某种原因,服务器可能会阻塞 >1000 个连接。配置?缺乏资源? This 可能会有所帮助。
-
如果所有这些请求都发往同一台服务器,这可能是服务器限制或服务器限制以防止 DoS 攻击。
标签: c# concurrency task-parallel-library httprequest task