c# - AspNet Core 3 HttpClientFactory:TaskCanceledException
问题描述
我在 Azure Kubernetes 服务中使用了一个 aspnet core 3 反向代理,它松散地基于ProxyKit,它曾经在以前的集群中工作得很好。在新集群上(我能看到的唯一区别是旧集群使用 kubenet,新集群使用 azure 虚拟网络)当上游请求花费超过几秒钟TaskCanceledException
的时间时,我会不断启动。HttpClient.SendAsync
这是引发异常的相关方法:
return await _httpClient.SendAsync(
UpstreamRequest,
HttpCompletionOption.ResponseContentRead,
HttpContext.RequestAborted)
.ConfigureAwait(false);
HttpClient
是通过HttpClientFactory
使用类型化AddHttpClient
中间件提供的。
到目前为止我尝试过的事情:
- 显式设置 30 秒超时
HttpClient
CancelationToken
向SendAsync
方法传递 no- 按照本文中的建议实施自定义超时处理
这是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 时,行为完全相同。
解决方案
我评论说:
当客户端关闭连接时,将发生诸如 SendAsync 之类的任务取消。因此,我认为你找错地方了。您需要弄清楚客户端过早关闭连接的原因。
结果,OP 能够确定此问题与 Azure 应用程序网关有关:
有道理,你是完全正确的。一整天都在拉我剩下的头发,罪魁祸首是 Azure 应用程序网关,请求超时为 1 秒。
推荐阅读
- objective-c - 方法在框架中折旧,但无法应用建议的更改
- git - 如何理解 Git Stage 是 Git 中最重要的概念之一?
- c# - RegAsm.exe 遇到问题
- c# - 在 C# 中异步使用 Web API
- ios - 添加启动屏幕图像,而不是使用 iOS 的 LaunchScreens.storyboard
- node.js - 具有特定端口的 Mongo 服务暴露在桥接网络 docker 中
- android - 使用 cURL 发送 FCM 消息,推荐使用哪个 api?
- slack - Slack Events API 不适用于普通用户
- android - Api 27 空对象引用
- angular - Angular 6 Reactive Form - 选择选项:禁用先前选择的选项