C# AspNet Core 3 HttpClientFactory:TaskCanceledException

C# AspNet Core 3 HttpClientFactory:TaskCanceledException,c#,asp.net-core,reverse-proxy,dotnet-httpclient,azure-aks,C#,Asp.net Core,Reverse Proxy,Dotnet Httpclient,Azure Aks,我在Azure Kubernetes服务中使用了一个aspnet core 3反向代理,该代理松散地基于,在以前的集群中工作得很好。在新集群上(我能看到的唯一区别是,旧集群使用kubenet,新集群使用azure虚拟网络),当上游请求花费的时间超过几秒钟时,我不断在HttpClient.SendAsync上获得TaskCanceledExceptions 这是引发异常的相关方法: return await _httpClient.SendAsync( Up

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

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

return await _httpClient.SendAsync(
                    UpstreamRequest,
                    HttpCompletionOption.ResponseContentRead,
                    HttpContext.RequestAborted)
                    .ConfigureAwait(false);
HttpClient
HttpClientFactory
使用键入的
AddHttpClient
中间件提供

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

  • HttpClient
  • 将no
    CancelationToken
    传递给
    SendAsync
    方法
  • 按照中的建议实现自定义超时处理
这是以前配置HttpClientFactory的方式:

var httpClientBuilder = services
                .AddHttpClient<ProxyKitClient>()
                .ConfigurePrimaryHttpMessageHandler(sp => new HttpClientHandler
                    {
                        AllowAutoRedirect = false,
                        UseCookies = false
                    });
var httpClientBuilder=services
.AddHttpClient()
.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
                    }
                });
var httpClientBuilder=services
.AddHttpClient(o=>o.Timeout=Timeout.InfiniteTimeSpan)
.ConfigurePrimaryHttpMessageHandler(sp=>new TimeoutHandler
{
InnerHandler=新的HttpClientHandler
{
AllowAutoRedirect=false,
UseCookies=false
}
});
行为没有任何改变

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

作为旁注,当我回到aspnet core 2.2时,行为完全相同。

我评论道:


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

因此,OP能够确定此问题存在于Azure Application Gateway:


有道理,你完全正确。我一整天都在胡思乱想,罪魁祸首是Azure Application Gateway,请求超时1秒


当客户端关闭连接时,将发生类似于
SendAsync
的任务取消。因此,我认为你找错地方了。你需要弄清楚为什么客户端会过早地关闭连接。这是有道理的,你是完全正确的。我一整天都在胡思乱想,罪魁祸首是Azure Application Gateway,请求超时1秒。