web-dev-qa-db-ja.com

ASP.Net Core2.1およびIHttpClientFactoryでのFlurlクライアントの有効期間

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を作成しますか?

12
Karel Kral

まず、MSの新しいHttpClientFactoryは、ASP.NET Core2.1およびその組み込みDIコンテナーと組み合わせて使用​​することを目的としていることに注意してください。コントローラまたはサービスクラスにFlurlClientsを挿入せず、代わりに次のように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の規定どおりにHttpClientFactoryConfigureServicesを設定することをお勧めします。また、FlurlClientインスタンスが必要な場合は、HttpClientインスタンスを取得するコンストラクターを使用してください。たとえば、型指定されたクライアントパターンを使用する場合、サービスクラスは次のようになります。

public class MyService
{
    private readonly IFlurlClient _flurlClient;

    public MyService(HttpClient httpClient)
    {
        _flurlClient = new FlurlClient(httpClient);
    }
}
10
Todd Menier