2017-07-15 159 views
0

我已经按照示例herehere成功处理与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. 

我怎样才能使这项工作正常?

+0

我不能产生相同的结果,虽然我不有你的端点。端点是否响应第三个呼叫? – dkackman

+0

@dkackman经过对Wireshark数据包嗅探的更多调查后,如果我重新使用httpClient,则在第二次调用时SYN/ACK不会发送到服务器。第二次呼叫超时,httpClient为第三次呼叫发送SYN/ACK,但服务器没有应答,这会造成超时。当我不重复使用httpClient时,它会为每个请求发送一个SYN/ACK,而不会发生任何问题。所以这似乎是一个服务器问题?令人惊讶的是,这是由一个IIS7.5服务器,这让我相信这将是一个代码问题...但我真的想知道如何编码这样的锁。 – jsgoupil

+0

无论“/ willtimeout”的确听起来像是它真的做了一个数字,如果它使整个服务无响应。这是一项受您控制的服务或其他人的代码吗? – dkackman

回答

0

CreateLinkedTokenSource创建CancellationTokenSource,当任何源令牌处于取消状态时,该取消状态将处于取消状态。

所以我想这是问题,只要创建新的令牌源每次和不链接到任何东西:

try 
{ 
    var cs = new CancellationTokenSource(); 
    // ... 
相关问题