【发布时间】:2019-07-15 13:59:59
【问题描述】:
我在 Azure Kubernetes 服务中使用了一个 aspnet core 3 反向代理,它松散地基于 ProxyKit,它曾经在以前的集群中工作得很好。在新集群上(我能看到的唯一区别是旧集群使用 kubenet,新集群使用 azure 虚拟网络)当上游请求花费超过几秒钟时,我不断在HttpClient.SendAsync 上收到TaskCanceledExceptions。
这是引发异常的相关方法:
return await _httpClient.SendAsync(
UpstreamRequest,
HttpCompletionOption.ResponseContentRead,
HttpContext.RequestAborted)
.ConfigureAwait(false);
HttpClient 由HttpClientFactory 使用类型化的AddHttpClient 中间件提供。
到目前为止我尝试过的事情:
- 为
HttpClient显式设置 30 秒超时 - 不将
CancelationToken传递给SendAsync方法 - 按照this article 中的建议实现自定义超时处理
这是 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 时,行为完全相同。
【问题讨论】:
-
当 client 关闭连接时,将发生类似
SendAsync的任务取消。因此,我认为你找错地方了。您需要弄清楚客户端过早关闭连接的原因。 -
有道理,你是完全正确的。一整天都在拉我剩下的头发,罪魁祸首是 Azure 应用程序网关,请求超时为 1 秒。
标签: c# asp.net-core reverse-proxy dotnet-httpclient azure-aks