我试图加载测试API。我正在执行一个任务,每个执行一个HTTP请求。我使用Task.WhenAll(mytasks)
等待所有任务完成。请求看起来如下:执行超过1000个HTTP请求任务失败
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级的任务)?我怎样才能防止这一点?我能明显把我的任务块成块< 1000,但我想离开这个基础系统...
您正在使用IIS在Windows 7或8上进行测试? – Max
例外情况'现有连接被远程主机强行关闭'可能是正在发生的事情的线索。 – Micke
@Max:Windows Server 2008 R2;没有IIS,我正在使用自托管的ASP.NET Web API – Dunken