2017-07-15 53 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(); 
    // ...