0
我已經按照示例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.
我怎樣才能使這項工作正常?
我不能產生相同的結果,雖然我不有你的端點。端點是否響應第三個呼叫? – dkackman
@dkackman經過對Wireshark數據包嗅探的更多調查後,如果我重新使用httpClient,則在第二次調用時SYN/ACK不會發送到服務器。第二次呼叫超時,httpClient爲第三次呼叫發送SYN/ACK,但服務器沒有應答,這會造成超時。當我不重複使用httpClient時,它會爲每個請求發送一個SYN/ACK,而不會發生任何問題。所以這似乎是一個服務器問題?令人驚訝的是,這是由一個IIS7.5服務器,這讓我相信這將是一個代碼問題...但我真的想知道如何編碼這樣的鎖。 – jsgoupil
無論「/ willtimeout」的確聽起來像是它真的做了一個數字,如果它使整個服務無響應。這是一項受您控制的服務或其他人的代碼嗎? – dkackman