.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のドキュメントを参考にしています。
ここに記載しているやり方以外もあるため、詳しくは公式ドキュメントを確認するのが良いです。
- ASP.NET Core で IHttpClientFactory を使用して HTTP 要求を行う
- IHttpClientFactory を使用して回復性のある HTTP 要求を実装する