複数のAPIサービス用の.NetCore HttpClientFactory

Sep 10 2020

約4つの異なるAPIサービスに接続する必要がある.NetCoreプロジェクトがあります。私はHttpClientコードの専門家ではありませんが、私が見つけたところによると、通常は1つのインスタンスのみを再利用したいということでした。あなたのHttpClientの。私が言えることから、一般的なコンセンサスは、Startupクラスに登録してからDIを使用して要求することにより、.NetCoreでHttpClientFactoryを使用することです。

現在、私のデフォルトヘッダーなどのほとんどは、BaseAddress urlを除いてすべて一般的に同じですが、4つのdiff APIサービスに接続するときにこれをどのように行う必要がありますか?4つの異なる名前付きクライアントを登録する必要がありますか、それともすべてのデフォルト情報が事前設定された1つのクライアントを用意してから、必要に応じて手動で構成する必要がありますか?

一般的な質問は、私がこれにかなり慣れていないので、HttpClientの1つのインスタンスを再利用すると言われています。

  1. APIサービスごとに4つの異なる名前付きクライアントを作成する場合、.CreateClient()メソッドを呼び出すと、HttpClientの4つのインスタンスが作成されませんか?
  2. .CreateClient()は、呼び出されるたびに新しいインスタンスを作成します。これは、1つのAPIサービスに対して3つの異なる呼び出しを行う必要がある場合に、HttpClientの1つのインスタンスを持つという目的を損なうものではありません。これらの呼び出しはそれぞれ。を呼び出します。 CreateClient()は、ある種の接続を確立し、HttpClientの3つのインスタンスを作成しますか?

明確にするための助けをいただければ幸いです、

ありがとう!

回答

2 scharnyw Sep 10 2020 at 14:01

を使用する目的は、のIHttpClientFactoryインスタンスを再利用することではありませんHttpClient。代わりに、HTTP接続とソケットを管理する基礎となるオブジェクトであるHttpMessageHandler(実際HttpClientHandlerには、抽象から派生した)のインスタンスを(プールすることによって)再利用するHttpMessageHandlerことです。Microsoft Docsのこの図は、それをよく示しています。

を頻繁に呼び出すと、を頻繁に呼び出すIHttpClientFactory.CreateClient()のと同じ問題が発生するのではないかと心配していましたnew HttpClient()。ただし、これは当てはまりません。Microsoftのドキュメントで説明されているように、を頻繁に呼び出すとnew HttpClient()ソケットが使い果たされるのは、このコンストラクターが次の新しいインスタンスを作成するためですHttpMessageHandler。

ただし、問題は実際にはHttpClient自体にあるのではなく、HttpClientのデフォルトのコンストラクターにあります。これは、上記のソケットの枯渇とDNS変更の問題があるHttpMessageHandlerの新しい具象インスタンスを作成するためです。

あなたは、から見ることができ、ソースコードのIHttpClientFactoryそれはのパラメータなしのコンストラクタを使用しないことHttpClientではCreateClient()。代わりに、HttpMessageHandlerプールからを取得して、作成されたに注入しHttpClientます。

型付きクライアントと名前付きクライアントのどちらを使用している場合でも、HttpClientインスタンスは一時的なオブジェクトであるかのように使用する必要があります。作成するのに費用がかからず、長期間キャッシュする必要がありません。