スポンサーリンク

.NETでHttpClientを依存性注入(DI)で使うベストプラクティス

.NET で外部APIを呼び出す際に HttpClient を使用することは非常に一般的です。しかし、その使い方を間違えると、ソケットの枯渇やパフォーマンス劣化といった深刻な問題を引き起こします。

この記事では、HttpClient を依存性注入(DI)を通じて安全に使うためのベストプラクティスを紹介します。

なぜ HttpClient を使い回してはいけないのか?

以下のようなコードを見かけたことがあるかもしれません。

var client = new HttpClient();

このように毎回 new してしまうと、ソケットが解放されずに蓄積し、最終的には「ソケット枯渇(Socket exhaustion)」というエラーに繋がります。

そのため、HttpClient は 適切に使い回す必要があります。

DIを通してHttpClientを使う

NETでは、IHttpClientFactory を使った方法が推奨されています。

ステップ1:HttpClient を登録する

Program.cs(または Startup.cs)で以下のように HttpClient をサービスとして登録します。

builder.Services.AddHttpClient();

ステップ2:コンストラクタで注入する

public class MyService
{
    private readonly HttpClient _httpClient;

    public MyService(HttpClient httpClient)
    {
        _httpClient = httpClient;
    }

    public async Task<string> GetDataAsync()
    {
        var response = await _httpClient.GetAsync("https://api.example.com/data");
        return await response.Content.ReadAsStringAsync();
    }
}

まとめ

他にもやり方はあるのですが、とりあえずは上記のやり方のように、
httpClient をnewで大量に生成しないような形にすればよいのかと思います。

参考

以下のMicrosoftのドキュメントを参考にしています。
ここに記載しているやり方以外もあるため、詳しくは公式ドキュメントを確認するのが良いです。