AspNet Core 3 HttpClientFactory:TaskCanceledException

时间:2019-07-15 13:59:59

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

我正在Azure Kubernetes Service中使用松散地基于ProxyKit的aspnet core 3反向代理,该代理曾经在以前的群集中可以正常工作。在新群集上(我唯一看到的区别是,旧群集使用了kubenet,新群集使用了azure虚拟网络)当上游请求占用的资源超过一个时,我不断在TaskCanceledException上获得HttpClient.SendAsync几秒钟。

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

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时,其行为是完全相同的。

1 个答案:

答案 0 :(得分:1)

我评论了

  

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

结果,OP能够确定此问题与Azure应用程序网关有关:

  

说得通,你是完全正确的。一整天都在拉扯我剩下的头发,罪魁祸首是Azure Application Gateway,请求超时为1秒。