HttpClient取消不会杀死底层TCP调用

RPM*_*984 6 c# cancellationtokensource dotnet-httpclient cancellation-token

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

我通过这样做了CancellationTokenSource.

这是相关的代码:

var cancellationToken = new CancellationTokenSource();
cancellationToken.CancelAfter(TimeSpan.FromSeconds(5));
var result = _httpClient.SendAsync(request, cancellationToken.Token);
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

我希望在触发取消时基础请求也会被取消.

_httpClient 实例化如下: new HttpClient { BaseAddress = baseAddress }

我知道有Timeout设置,但不确定我是否应该使用它或取消令牌?我的猜测是Timeout针对非异步/等待的情况?

huy*_*itw 3

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

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

另外,如果你想在 5 秒后取消每个请求,你也可以设置toTimeout的属性。行为将完全相同(如果另一端在 5 秒内没有响应,则会抛出 a)。_httpClientTimeSpan.FromSeconds(5)TaskCanceledException