C# AspNet Core 3 HttpClientFactory:TaskCanceledException
我在Azure Kubernetes服务中使用了一个aspnet core 3反向代理,该代理松散地基于,在以前的集群中工作得很好。在新集群上(我能看到的唯一区别是,旧集群使用kubenet,新集群使用azure虚拟网络),当上游请求花费的时间超过几秒钟时,我不断在HttpClient.SendAsync上获得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
TaskCanceledException
s
这是引发异常的相关方法:
return await _httpClient.SendAsync(
UpstreamRequest,
HttpCompletionOption.ResponseContentRead,
HttpContext.RequestAborted)
.ConfigureAwait(false);
HttpClient
由HttpClientFactory
使用键入的AddHttpClient
中间件提供
到目前为止我已经尝试过的事情:
- 为
HttpClient
- 将no
传递给CancelationToken
方法SendAsync
- 按照中的建议实现自定义超时处理
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秒。