c# - HttpClient 取消不会终止底层 TCP 调用

标签 c# dotnet-httpclient cancellationtokensource cancellation-token

我正在尝试将 HttpClient 调用的默认超时设置为 5 秒。

我已通过 CancellationTokenSource 完成此操作。

下面是相关的代码:

var cancellationToken = new CancellationTokenSource();
cancellationToken.CancelAfter(TimeSpan.FromSeconds(5));
var result = _httpClient.SendAsync(request, cancellationToken.Token);

在调用代码出现“任务已取消”错误时(我在 .NET 4.7 控制台应用程序中测试过),按我的预期工作,但我注意到在 Fiddler 中请求仍在运行 1 分钟,直到它最终放弃了:

enter image description here

有人可以解释这种行为吗?

我希望底层请求在取消被触发时也被取消。

_httpClient 被实例化为:new HttpClient { BaseAddress = baseAddress }

我知道有 Timeout 设置,但不确定我应该使用那个还是取消 token ?我的猜测是 Timeout 是针对非异步/等待情况的吗?

最佳答案

正如 Damien 在评论中所说,HttpClient 尽可能重用连接,这就是取消时连接未关闭的原因。

当取消这样的请求时,HttpClient 将停止向/从另一端发送/接收数据。它不会发送任何信息来通知另一端它已被取消。因此,您看到的 1 分钟超时取决于连接另一端的行为。

此外,如果您想在 5 秒后取消每个请求,您也可以将 _httpClientTimeout 属性设置为 TimeSpan.FromSeconds(5) 。行为将完全相同(如果另一端在 5 秒内未响应,将抛出 TaskCanceledException)。

关于c# - HttpClient 取消不会终止底层 TCP 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45541845/

相关文章:

c# - 对 CancellationTokenSource.Cancel 的调用永远不会返回

c# - 链接取消 token

c# - 是否需要 static List<WeakReference>?

c# - Caliburn.Micro 将 View 模型与 ItemsControl 绑定(bind)列表

c# - 发帖后查看不更新

C# HttpClient 一个现有的连接被远程主机强行关闭

c# - 通过 http 异步发送数据

c# - DrawLine 方法提供比 DrawLines 方法更高的质量

c# - 使用 HttpClient 进行异步文件下载

c# - CancellationToken 泄漏内存