我在使用HttpClient (.NETStandard v2.1, System.Net.Http, targeting mono runtime)时遇到了一个问题。我想通过在SendAsync中传递CancellationToken来为每个请求设置HttpClient的超时时间。
当使用HttpClient的无参数构造函数时,它可以正常工作,但是当将HttpClientHandler实例传递给HttpClient构造函数时,它被忽略了。操作在75秒后被取消。
举个例子:
在5秒后,调试输出会写入“任务取消”,但
我需要
当使用HttpClient的无参数构造函数时,它可以正常工作,但是当将HttpClientHandler实例传递给HttpClient构造函数时,它被忽略了。操作在75秒后被取消。
举个例子:
public static async Task<HttpResponseMessage> Send()
{
var req = new HttpRequestMessage(HttpMethod.Get, new Uri("someURL"));
var handler = new HttpClientHandler{ CookieContainer = new CookieContainer() };
/* var client = new HttpClient(); <--- This is working */
var client = new HttpClient(handler);
var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));
cts.Token.Register(() => Debug.WriteLine("TASK CANCELLED"));
return await client.SendAsync(req, cts.Token);
}
在5秒后,调试输出会写入“任务取消”,但
SendAsync
仍然持续了75秒。如果使用无参构造函数,则SendAsync
将在5秒后取消。我需要
HttpClientHandler
使用CookieContainer
属性。 我错过了什么?
编辑
经过进一步调查和 @Lasse Vågsæther Karlsen 的提示,我发现以下内容:
.NET Core 3 运行时
- 如果 URL 不可达或者网络连接断开,
HttpClient
会在 3 秒后抛出HttpRequestException
- 否则它按预期在 5 秒后取消
- 如果 URL 不可达或者网络连接断开,
Mono 运行时(Xamarin.Forms 项目)
- 如果 URL 不可达或者网络连接断开,
HttpClient
会在 75 秒后抛出OperationCanceledException
- 否则它按预期在 5 秒后取消
- 如果 URL 不可达或者网络连接断开,
可能与 this 有关。
尽管如此,仍存在一个未解决的问题...
HttpClient
和 mono 运行时可能存在问题。作为一个中等的解决方法,我使用了这个插件 链接,它提供了一个名为IsRemoteReachable
的属性,在 Android 平台实现中,它会创建一个新的Socket
连接到指定的url
,并使用timeout
,我在进行http 请求
之前使用它来指定可达性,超时时间为 1000ms。我不认为这是一个解决方案,仍在寻找更优雅的解决方法。 - Γαβριήλ Σαμώλης