我正在尝试将 HttpClient 调用的默认超时设置为 5 秒。
我已通过 CancellationTokenSource
完成此操作。
下面是相关的代码:
var cancellationToken = new CancellationTokenSource();
cancellationToken.CancelAfter(TimeSpan.FromSeconds(5));
var result = _httpClient.SendAsync(request, cancellationToken.Token);
在调用代码出现“任务已取消”错误时(我在 .NET 4.7 控制台应用程序中测试过),按我的预期工作,但我注意到在 Fiddler 中请求仍在运行 1 分钟,直到它最终放弃了:
有人可以解释这种行为吗?
我希望底层请求在取消被触发时也被取消。
_httpClient
被实例化为:new HttpClient { BaseAddress = baseAddress }
我知道有 Timeout
设置,但不确定我应该使用那个还是取消 token ?我的猜测是 Timeout
是针对非异步/等待情况的吗?
最佳答案
正如 Damien 在评论中所说,HttpClient
尽可能重用连接,这就是取消时连接未关闭的原因。
当取消这样的请求时,HttpClient
将停止向/从另一端发送/接收数据。它不会发送任何信息来通知另一端它已被取消。因此,您看到的 1 分钟超时取决于连接另一端的行为。
此外,如果您想在 5 秒后取消每个请求,您也可以将 _httpClient
的 Timeout
属性设置为 TimeSpan.FromSeconds(5)
。行为将完全相同(如果另一端在 5 秒内未响应,将抛出 TaskCanceledException
)。
关于c# - HttpClient 取消不会终止底层 TCP 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45541845/