[미디엄] C# HttpClient 인스턴스를 재사용 하기

[미디엄] C# HttpClient 인스턴스를 재사용 하기

글 : 10 Costly HttpClient Mistakes in C#.NET (And How to Fix Them Like a Pro)

글쓴이 : AshokReddy

많은 개발자가 매 요청마다 새로운 HttpClient 인스턴스를 생성합니다. 하지만 이는 각 인스턴스가 시스템 소켓을 소모하여 소켓 고갈 및 성능 저하를 초래하기 때문에 바람직하지 않습니다.

public async Task<string> GetDataAsync(string url)
{
    using (var client = new HttpClient()) // ❌ Bad: New client per request
    {
        return await client.GetStringAsync(url);
    }
}

대신, 여러 요청에 걸쳐 단일 HttpClient 인스턴스를 재사용하는 것이 좋습니다. 이렇게 하면 과도한 소켓 사용량을 방지할 수 있습니다.

private static readonly HttpClient _httpClient = new HttpClient();  

public async Task<string> GetDataAsync(string url)  
{  
    return await _httpClient.GetStringAsync(url);  
}

*. 웹 프로젝트에서는 IHttpClientFactory를 사용합니다.
*. Make HTTP requests with the HttpClient class

6개의 좋아요

예전에 TIME_WAIT 안 생기게 setsocketopt SO_LINGER off 했던 기억이 나네요

1개의 좋아요
// Allow 1 second to process queued msgs before closing the socket.
LingerOption lingerOption = new LingerOption (true, 1);
tcpClient.LingerState = lingerOption;
tcpClient.Close();

// Close the socket right away without lingering.
LingerOption lingerOption = new LingerOption (true, 0);
tcpClient.LingerState = lingerOption;
tcpClient.Close();

출처 : To close the socket, don’t Close() the socket. Uhmm?

1개의 좋아요

HttpClient를 재사용하기보다는 Handler만 재사용하는게 더 좋지 않을까요?

IHttpClientFactory도 내부적으로는 Handler를 재사용하는 것으로 알고 있습니다.

2개의 좋아요

제 기억에도 Handler를 재사용하는 것으로 알고 있습니다.

그래서 Generic Host에서도 HttpClient를 등록할 때 Handler도 함께 등록해서 썼던 것 같습니다. IHttpClientFactory를 사용할 때라면 Handler를 그때그때 바꿔가면서 동적으로 사용하진 못했던 거 같습니다.

HttpClient를 따로 만들어서 관리받지 못하는 환경에서 써야 Handler를 그때그때 바꿔가며 쓸 수 있을텐데 그럼 사실 Generic Host에 AddHttpClient()를 할 이유는 없긴하죠.

1개의 좋아요