2017-10-22 25 views
6

オープンTCP接続をHttpClientと再利用するには、すべての要求に対して1つのインスタンスを共有する必要があります。HttpClientを再使用しますが、リクエストごとにタイムアウトの設定は異なりますか?

これは、の場合、異なる設定(タイムアウトやヘッダーなど)で簡単にインスタンス化できないことを意味します。

どのようにして接続を共有し、異なる設定を同時に使用できますか?これは、デフォルトでは非常に簡単で、より古いものでした。HttpWebRequestWebClientインフラストラクチャです。

要求を行う前にHttpClient.Timeoutを設定するだけでは、スレッドセーフではなく、並行アプリケーション(ASP.NET Webサイトなど)では機能しません。

+1

:この問題を解決するには、無限の可能HttpClientの「最大」のタイムアウトを設定しますか?ヘッダーのようなものは要求ごとに設定可能であり、さまざまな 'BaseAddress'はあまり意味がありません。実際には、Timeoutは、同じインスタンス上で変更したいと思う_only_プロパティかもしれません。質問ごとに異なるタイムアウトを使用する方法を示しています。 –

+0

@ToddMenierそれは良い点です。それは質問に答えます、はい! – boot4life

+0

'HttpClient'を再利用するということは、_single_ TCP接続を再利用していることを意味します。ここには「プール」はありません。 –

答えて

7

HttpClientは、キャンセルトークンを使用してタイムアウト動作を実装するだけです。あなたが要求ごとにそれを変更したい場合は、直接同じ操作を行うことができます。

HttpClientのデフォルトのタイムアウトは100秒で、要求はまだあなたが設定した場合でも、その時点でキャンセルされること
var cts = new CancellationTokenSource(); 
cts.CancelAfter(TimeSpan.FromSeconds(30)); 
await httpClient.GetAsync("http://www.google.com", cts.Token); 

注意要求レベルでより高い値。あなたは `Timeout`以外の同じインスタンス上で変化させるために探している設定

httpClient.Timeout = System.Threading.Timeout.InfiniteTimeSpan; 
+0

もう1つの答えで言及したように、これによりキャンセルの時間を短縮することができます。したがって、この方法を使用する予定がある場合は、デフォルトのタイムアウトを無限(またはそれ以外の何かが満足できる値)に設定し、各**要求ごとに独自の取り消しトークンを提供することを計画するのが最適かもしれません。 – crush

+0

良い点。回答が更新されました。 –

関連する問題