2017-07-15 33 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

私は同じ結果を生成することができない、私はしませんがあなたのエンドポイントを持っている。 3番目のコールでエンドポイントが応答しますか? – dkackman

+0

@dkackmanいくつかのWireSharkパケットスニッフィングでさらに多くの調査を行った後、httpClientを再使用すると、2回目の呼び出しでSYN/ACKがサーバーに送信されません。 2番目のコールがタイムアウトすると、httpClientは3番目のコールに対してSYN/ACKを送信しますが、サーバによって応答されず、タイムアウトが発生します。私がhttpClientを再利用しないと、毎回のリクエストごとにSYN/ACKが送信され、問題は発生しません。だから、これはサーバーの問題と思われますか?驚いたことに、これはIIS7.5サーバーによって提供されているため、コードの問題になると私は信じています...しかし、私は本当にそのようなロックがどのようにコード化されるのだろうかと思っています。 – jsgoupil

+0

"/ willtimeout"はサービス全体が応答しなくなった場合、実際には数字のように聞こえます。それはあなたのコントロール下にあるサービスですか、他人のコードですか? – dkackman

答えて

0

CreateLinkedTokenSourceソーストークンのいずれかがキャンセルされた状態になったときにキャンセルされるCancellationTokenSourceを作成します。

だから、僕は新しいトークンソースを毎回作成して、何にリンクしていない、これが問題であると思います:

try 
{ 
    var cs = new CancellationTokenSource(); 
    // ... 
関連する問題