C#HttpClient服务器超时取消所有后续请求
问题描述:
我已经按照示例here和here成功处理与C#HttpClient的超时,但我不能使它的工作!C#HttpClient服务器超时取消所有后续请求
var urls = new List<string> { "/success", "/willtimeout", "/success" };
var baseAddress = "http://endpoint";
var httpClient = new HttpClient();
httpClient.Timeout = new TimeSpan(0, 0, 30);
httpClient.BaseAddress = new Uri(baseAddress);
foreach (var url in urls)
{
try
{
var cs = CancellationTokenSource.CreateLinkedTokenSource(CancellationToken.None);
cs.CancelAfter(new TimeSpan(0, 0, 3));
var result = await httpClient.GetAsync(urls, cs.Token);
Console.WriteLine("Success");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
这段代码打印,而无需创建每次新的HttpClient
Success
A task was canceled.
A task was canceled.
我怎样才能使这项工作正常?
答
CreateLinkedTokenSource创建CancellationTokenSource,当任何源令牌处于取消状态时,该取消状态将处于取消状态。
所以我想这是问题,只要创建新的令牌源每次和不链接到任何东西:
try
{
var cs = new CancellationTokenSource();
// ...
我不能产生相同的结果,虽然我不有你的端点。端点是否响应第三个呼叫? – dkackman
@dkackman经过对Wireshark数据包嗅探的更多调查后,如果我重新使用httpClient,则在第二次调用时SYN/ACK不会发送到服务器。第二次呼叫超时,httpClient为第三次呼叫发送SYN/ACK,但服务器没有应答,这会造成超时。当我不重复使用httpClient时,它会为每个请求发送一个SYN/ACK,而不会发生任何问题。所以这似乎是一个服务器问题?令人惊讶的是,这是由一个IIS7.5服务器,这让我相信这将是一个代码问题...但我真的想知道如何编码这样的锁。 – jsgoupil
无论“/ willtimeout”的确听起来像是它真的做了一个数字,如果它使整个服务无响应。这是一项受您控制的服务或其他人的代码吗? – dkackman