【问题标题】:AspNet Core 3 HttpClientFactory: TaskCanceledExceptionAspNet Core 3 HttpClientFactory:TaskCanceledException
【发布时间】:2019-07-15 13:59:59
【问题描述】:

我在 Azure Kubernetes 服务中使用了一个 aspnet core 3 反向代理,它松散地基于 ProxyKit,它曾经在以前的集群中工作得很好。在新集群上(我能看到的唯一区别是旧集群使用 kubenet,新集群使用 azure 虚拟网络)当上游请求花费超过几秒钟时,我不断在HttpClient.SendAsync 上收到TaskCanceledExceptions。

这是引发异常的相关方法:

return await _httpClient.SendAsync(
                    UpstreamRequest,
                    HttpCompletionOption.ResponseContentRead,
                    HttpContext.RequestAborted)
                    .ConfigureAwait(false);

HttpClientHttpClientFactory 使用类型化的AddHttpClient 中间件提供。

到目前为止我尝试过的事情:

  • HttpClient 显式设置 30 秒超时
  • 不将CancelationToken 传递给SendAsync 方法
  • 按照this article 中的建议实现自定义超时处理

这是 HttpClientFactory 之前的配置方式:

var httpClientBuilder = services
                .AddHttpClient<ProxyKitClient>()
                .ConfigurePrimaryHttpMessageHandler(sp => new HttpClientHandler
                    {
                        AllowAutoRedirect = false,
                        UseCookies = false
                    });

这是现在的配置:

var httpClientBuilder = services
                .AddHttpClient<ProxyKitClient>(o => o.Timeout = Timeout.InfiniteTimeSpan)
                .ConfigurePrimaryHttpMessageHandler(sp => new TimeoutHandler
                {
                    InnerHandler = new HttpClientHandler
                    {
                        AllowAutoRedirect = false,
                        UseCookies = false
                    }
                });

行为没有任何改变。

如何确保HttpClient 等待上游请求完成? Kestrel 和 HttpClient 的默认超时时间远高于现在中止的请求。

附带说明,当我恢复到 aspnet core 2.2 时,行为完全相同。

【问题讨论】:

  • client 关闭连接时,将发生类似SendAsync 的任务取消。因此,我认为你找错地方了。您需要弄清楚客户端过早关闭连接的原因。
  • 有道理,你是完全正确的。一整天都在拉我剩下的头发,罪魁祸首是 Azure 应用程序网关,请求超时为 1 秒。

标签: c# asp.net-core reverse-proxy dotnet-httpclient azure-aks


【解决方案1】:

我评论了:

当客户端关闭连接时,将发生诸如 SendAsync 之类的任务取消。因此,我认为你找错地方了。您需要弄清楚客户端过早关闭连接的原因。

因此,OP 能够确定此问题出在 Azure 应用程序网关上:

有道理,你是完全正确的。一整天都在拉我剩下的头发,罪魁祸首是 Azure 应用程序网关,请求超时为 1 秒。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-11
    • 2020-02-21
    • 2018-02-03
    • 2020-05-15
    • 2018-12-29
    • 1970-01-01
    相关资源
    最近更新 更多