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.
を印刷するのだろうか?
私は同じ結果を生成することができない、私はしませんがあなたのエンドポイントを持っている。 3番目のコールでエンドポイントが応答しますか? – dkackman
@dkackmanいくつかのWireSharkパケットスニッフィングでさらに多くの調査を行った後、httpClientを再使用すると、2回目の呼び出しでSYN/ACKがサーバーに送信されません。 2番目のコールがタイムアウトすると、httpClientは3番目のコールに対してSYN/ACKを送信しますが、サーバによって応答されず、タイムアウトが発生します。私がhttpClientを再利用しないと、毎回のリクエストごとにSYN/ACKが送信され、問題は発生しません。だから、これはサーバーの問題と思われますか?驚いたことに、これはIIS7.5サーバーによって提供されているため、コードの問題になると私は信じています...しかし、私は本当にそのようなロックがどのようにコード化されるのだろうかと思っています。 – jsgoupil
"/ willtimeout"はサービス全体が応答しなくなった場合、実際には数字のように聞こえます。それはあなたのコントロール下にあるサービスですか、他人のコードですか? – dkackman