我在Azure Kubernetes服务中使用了一个aspnet核心3反向代理,它松散地基于ProxyKit,它以前在以前的集群中工作得很好。在新集群上(我唯一能看到的区别是旧集群使用kubenet,新集群是一个蔚蓝的虚拟网络),当上游请求花费超过几秒钟的时间时,我经常在HttpClient.SendAsync上获得HttpClient.SendAsyncs。
这是引发异常的相关方法:
return await _httpClient.SendAsync(
UpstreamRequest,
HttpCompletionOption.ResponseContentRead,
HttpContext.RequestAborted)
.ConfigureAwait(false);HttpClient由HttpClientFactory使用类型化AddHttpClient中间件提供。
到目前为止我尝试过的事情:
HttpClient的30秒超时CancelationToken传递给SendAsync方法在此之前,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核心2.2时,行为完全相同。
发布于 2019-07-16 12:37:17
我评论说:
当客户端关闭连接时,会出现类似SendAsync之类的任务取消。所以,我觉得你找错地方了。您需要弄清楚客户端为什么过早地关闭连接。
因此,OP能够确定这个问题与Azure应用程序网关有关:
说得通,你说的完全对。一整天都在拔我的头发,罪魁祸首是Azure应用程序网关,请求超时时间为1秒。
https://stackoverflow.com/questions/57041377
复制相似问题