読者の皆様へ:ノイズを減らすための一連の機能を開発しました。関心のあるトピックについて電子メールとWeb通知を受け取ることができます。新機能の詳細をご覧ください。
2016年に報告したように、.NETのHttpClientには深刻な問題がある。.NET Core 2.1にHttpClientFactoryを導入したことで、これらの問題のいくつかが軽減された。
HttpClientの基本的な問題は、使用直後に廃棄されるかのような、呼び出し単位のリソースのように見えることである。実際には、宛先サーバごとに1回作成され、アプリケーションの生存中は保持される。DNSキャッシュをクリアする必要がある場合などは除く。
新しいHttpClientFactoryを使用すると、アプリケーションの起動時にHttpClientを事前設定できる。各設定に名前が付けられているため、正しい設定でHttpClientを要求するのが容易になる。名前のない設定も、カスタム設定が不要な場合に提供される。
文字列は間違いを起こしやすいため、HttpClientの設定に特定のタイプでキーを付けることができる。たとえば、GitHubServiceクラスの設定を作成できる。DIフレームワークによって、GitHubServiceのインスタンスが、デフォルト設定ではなく、その設定を使ったHttpClientと共に提供されるようになる。
HttpClientを管理するこの新しいフレームワークでは、HttpClientを使用するための基本的なルールの変更はない。HttpClientを破棄することは依然として危険である。DNSキャッシュの問題に関して、Karel Zikmund氏は次のように述べている。
私たちは、ManagedHandlerで直接、DNS変更の問題に対処するための設計について積極的に検討しています。現在、DNS TTLサポート(#24257)またはConnectionLeaseTimeoutに似たAPI(#26331)の2つのオプションを検討しています。DNS変更のシナリオが2.1タイムフレームのHttpClientFactory機能との組み合わせで対処されることを今後確認してきます。
メッセージハンドラと自動リトライ
HttpClientのほとんど知られていない機能は、メッセージハンドラを追加する機能である。追加設定なしで、HttpClientHandlerは、自動リダイレクトを許可するかどうか、どのCookieコンテナを使用するか、どのように事前認証の動作させるか、などの機能を制御する。
DelegatingHandlerのサブクラスを実装することで、この機能をさらに拡張できる。Channel 9のデモンストレーションでは、Daniel Roth氏が簡単なリトライハンドラの作成方法を示している。
HttpClientFactoryは、開発者がHttpClient設定の一部としてHttpClientHandlerをインクルードできるようにすることで、この機能を補完する。これは意図的にDIフレンドリな方法で実施される。
SocketHttpHandler
HttpClientHandlerのサブシステムは動作を変更するためだけのものではない。HttpClientがネットワークで通信する方法を完全に置き換えることもできる。Microsoft社ではSocketHttpHandlerの導入により、これを活用している。これは、「libcurl(Linux用)とWinHTTP(Windows用)のプラットフォーム依存性」を排除した、「新規に1から作り上げられたマネージされたHttpClientHandler」である。この発表は下記のように続く。
プレビュー1では、次のいずれかの方法でSocketHTTPHandlerを使用するようにオプトインできます。
環境変数: COMPlus_UseManagedHttpClientHandler=true
AppContext: System.Net.Http.UseManagedHttpClientHandler=true
ASP.NETのソケットモードを有効にすることもできる。最終的には、現在のネイティブ実装がオプトインになっている状態がデフォルトになる可能性がある。
Rate this Article
- Editor Review
- Chief Editor Action