我正在Azure Kubernetes Service中使用松散地基于ProxyKit的aspnet core 3反向代理,该代理曾经在以前的群集中可以正常工作。在新群集上(我唯一看到的区别是,旧群集使用了kubenet,新群集使用了azure虚拟网络)当上游请求占用的资源超过一个时,我不断在TaskCanceledException
上获得HttpClient.SendAsync
几秒钟。
这是引发异常的相关方法:
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 core 2.2时,其行为是完全相同的。
答案 0 :(得分:1)
我评论了
当客户端关闭连接时,将发生诸如SendAsync之类的任务取消。因此,我认为您在找错地方。您需要弄清楚客户端为什么过早关闭连接。
结果,OP能够确定此问题与Azure应用程序网关有关:
说得通,你是完全正确的。一整天都在拉扯我剩下的头发,罪魁祸首是Azure Application Gateway,请求超时为1秒。