首页 > 解决方案 > AspNet Core 3 HttpClientFactory:TaskCanceledException

问题描述

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

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

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

HttpClient是通过HttpClientFactory使用类型化AddHttpClient中间件提供的。

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

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

标签: c#asp.net-corereverse-proxydotnet-httpclientazure-aks

解决方案


我评论说:

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

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

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


推荐阅读