【问题标题】:HttpRequestException when doing a client.SendAsync执行 client.SendAsync 时出现 HttpRequestException
【发布时间】:2014-10-02 12:26:59
【问题描述】:

突然之间,这段通常有效的代码开始抛出 HttpRequestException 错误。在日志中,我看到请求实际上是在引发错误前 1 分 35 秒发送的。会不会是超时问题?

代码如下:

private async Task<HttpResponseMessage> RunRequest(HttpRequestMessage request)
{            
    var client = new HttpClient();
    var response = await client.SendAsync(request).ConfigureAwait(false);              
    return response;           
}

这里是调用者(可能有 10K 到 50K 项):

int counter = 0;
var tasks = items.Select(async i =>
{
    if (await RunRequest(CreateRequest(i)))
        counter++
}).ToList();

if (tasks.Any())
{ 
    await Task.WhenAll(tasks);
}

这是错误:

System.Net.Http.HttpRequestException: An error occurred while sending the request. ---> System.Net.WebException: The request was aborted: The request was canceled.
        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 MyClass.<RunRequest>d__c.MoveNext()
        --- End of inner exception stack trace ---
        at MyClass.<RunRequest>d__c.MoveNext()
        --- End of stack trace from previous location where exception was thrown ---
        at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
        at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
        at MyClass.<RunRequest>d__0.MoveNext()

Task.WhenAll 可以处理的限制有吗?

【问题讨论】:

  • “突然间……”那么,发生了什么变化?
  • 没有什么我能想到的。事实上,这段代码大部分时间都运行良好。这个错误随机出现。一个可能的变化/变量可能是请求的数量。可能有大约 10000 次 RunRequest 调用。
  • 每个请求通常需要多长时间?
  • “错误出现在 2 分钟后”:你确定它实际上不是 1 分 40 秒吗?默认超时为 100 秒
  • 10000 是 很多 个请求一次性向服务器抛出。你可能想把这些错开一点。 WhenAll没有限制;这几乎肯定是服务器可伸缩性问题(不在您的代码中)。即,如果服务器不是async,它就无法快速响应请求量的突然变化。

标签: c# .net asynchronous async-await dotnet-httpclient


【解决方案1】:

如果您的所有请求都发往同一个域,那么您需要将其添加到您的“Web.config”文件中(默认只有 2 个):

<configuration>
    <system.net>
        <connectionManagement>
            <add address="*" maxconnection="100" />
        </connectionManagement>
    <system.net>
<configuration>

你已经在依次等待每一个RunRequest,所以实际上没有并行运行 - 你的Task.WhenAll应该抛出一个异常,因为你给它一个HttpResponseMessage列表而不是@ 987654325@ 列表。

RunRequest 不返回bool,那么您如何在if 中使用它?

...这段代码有很多错误...

【讨论】:

  • @Prabhu - 那么您不会在等待RunRequest,这很好,但是您发布的伪代码甚至无法编译,更不用说运行......发布真实的东西
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-07
  • 1970-01-01
  • 1970-01-01
  • 2020-08-12
  • 2017-08-12
  • 2014-03-13
  • 2020-05-08
相关资源
最近更新 更多