Flurlは、シングルトンクライアントの使用が推奨されるパターンであると述べています。
HttpClientは、一度インスタンス化され、アプリケーションの存続期間を通じて再利用されることを目的としています。特にサーバーアプリケーションでは、リクエストごとに新しいHttpClientインスタンスを作成すると、高負荷で使用可能なソケットの数が使い果たされます。これにより、SocketExceptionエラーが発生します。
ただし、Asp.Net Core 2.1以降、 Net Core 2.1でのHttpClientの有効期間に関する更新されたルール があります。
HttpClientFactoryを使用してHttpClientをリクエストすると、実際には毎回新しいインスタンスが取得されます。つまり、状態の変更について心配する必要はありません。このHttpClientは、プールの既存のHttpClientHandlerを使用する場合と使用しない場合があるため、既存の開いている接続を使用します。
ボンネットの下でIHttpClientFactoryを使用するようにFlurlを変更するにはどうすればよいですか?カスタムFlurlを作成する必要がありますsettings.HttpClientFactory
そしてMSIHttpClientFactoryを介してHttpClientを作成しますか?
まず、MSの新しいHttpClientFactory
は、ASP.NET Core2.1およびその組み込みDIコンテナーと組み合わせて使用することを目的としていることに注意してください。コントローラまたはサービスクラスにFlurlClient
sを挿入せず、代わりに次のようにFlurlを使用している場合:
await url.GetJsonAsync();
それならそれも関係ありませんMSを使用するには、not実装 FlurlのIHttpClientFactory である必要があります。 DIコンテナを使用するための適切なコンテキストがないため、アンチパターンであるサービスの場所に頼ることになります。利用したいこれらの新しいソケットプーリング機能は、実際には下位レベルで動作します: System.Net.Http.SocketsHttpHandler
。 FlurlはデフォルトでHttpClientHander
をメッセージハンドラーとして使用しますが、幸いなことに、.NET Core 2.1で書き直され、すべての作業がデフォルトでSocketsHttpHandler
に延期されています。言い換えると、。NET Core 2.1アプリでFlurlを使用している場合、MSが取り組んでいるすべての新しいソケット管理機能をすでに取得しています。
are ASP.NET Core 2.1アプリでFlurlClient
を明示的に使用してHttpClient
の代わりに使用し、MSのHttpClientFactory
が提供するものを利用しながら、それをクラスに注入したい場合は、 MSの規定どおりにHttpClientFactory
にConfigureServices
を設定することをお勧めします。また、FlurlClient
インスタンスが必要な場合は、HttpClient
インスタンスを取得するコンストラクターを使用してください。たとえば、型指定されたクライアントパターンを使用する場合、サービスクラスは次のようになります。
public class MyService
{
private readonly IFlurlClient _flurlClient;
public MyService(HttpClient httpClient)
{
_flurlClient = new FlurlClient(httpClient);
}
}