ASP.NET 로 애플리케이션을 만들 때, HttpClient 클래스의 인스턴스를 사용하여 HTTP 요청을 보냅니다. HttpClient 사용은 간단해 보일 수 있습니다. 하지만 일부 잠재적 문제는 애플리케이션이 무거운 부하를 받을 때까지는 발견되지 않습니다.
.NET에서 제공된 원래 HttpClient 클래스와 관련된 문제들:하이퍼링크 로그인이 보입니다.
HttpClient는 IDisposable을 구현할 때, using 문에서 이를 선언하고 인스턴스화하는 것이 선호되는 연산이 아닙니다.HttpClient 객체를 해제할 때, 기본 소켓은 그렇지 않습니다즉시석방, 이로 인해 소켓 소진 문제가 발생할 수 있습니다.
문제는 HttpClient 자체가 아니라 HttpClient의 기본 생성자에 있습니다. 이는 위에서 언급한 "소켓 소갈"과 DNS 변경 문제를 가진 새로운 실제 HttpMessageHandler 인스턴스를 생성합니다.
HttpClient 직접 생성하기 (잘못된 사용)
HttpClient 객체를 직접 인스턴스화하고, Dispose 메서드 호출을 보장하기 위해 사용하는 코드를 추가하면 다음과 같습니다:
인터페이스를 5번 호출하고, HttpClient를 사용해 HTTP 요청을 보내고, 다음 명령어로 네트워크 연결을 확인하세요:
HttpClient가 해제될 때 로컬 컴퓨터와 대상 서버 간의 연결은 다음과 같습니다TIME_WAIT동시성이 높은 경우, 오류는 다음과 같이 보고됩니다:
원격 서버에 연결할 수 없습니다
System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted.
궁금한 점이 있으시면 다음을 참고하실 수 있습니다:
IHttpClientFactory로 HttpClinet 생성 (올바른 사용법)
DI 의존성 주입 IHttpClientFactory를 사용하는 것은 IHttpClientFactory를 사용해 생성되는 HttpLinet과 동일합니다.
서비스를 시작 파일에 추가하면 코드는 다음과 같습니다:
HomeController 컨트롤러 코드는 다음과 같습니다:
또한 HttpClinet을 사용해 호출 인터페이스를 통해 5개의 요청을 보내고, 기계는 대상 서버와만 연결을 설정하며, 요청 과정 중에 연결을 재사용합니다. 아래에 나와 있습니다:
IHttpClientFactory는 자원 소비를 줄이기 위해 공장에서 생성된 HttpMessageHandler 인스턴스를 풀로 풀링합니다. 새로운 HttpClient 인스턴스를 생성할 때, 수명이 만료되지 않았다면 HttpMessageHandler 인스턴스를 풀에서 재사용할 수 있습니다.
{ "평생": "싱글턴", "ServiceType": "System.Net.Http.IHttpClientFactory", "ImplementationType": "Microsoft.Extensions.Http.DefaultHttpClientFactory" }, { "평생": "싱글턴", "ServiceType": "System.Net.Http.IHttpMessageHandlerFactory", "ImplementationType": "Microsoft.Extensions.Http.DefaultHttpClientFactory" } IHttpClientFactory는 기본적으로 DefaultHttpClientFactory로 구현되며, 소스 코드 주소는 다음과 같습니다:하이퍼링크 로그인이 보입니다.
DI가 활성화된 애플리케이션에서 IHttpClientFactory를 사용하면 다음을 피할 수 있습니다:
- HttpMessageHandler 인스턴스를 공유하여 자원 고갈 문제를 해결하세요.
- DNS 정체성 문제를 해결하려면 주기적으로 HttpMessageHandler 인스턴스를 루프 처리하세요.
또한, 장기 수명 소켓 HttpHandler 인스턴스를 사용하여 위 문제를 해결하는 다른 방법들도 있습니다.
- 앱 시작 시 SocketsHttpHandler 인스턴스를 생성하고 앱 수명 주기 전반에 걸쳐 사용하세요.
- DNS 갱신 시간에 따라 PooledConnectionLifetime을 적절한 값으로 설정하세요.
- 필요에 따라 새로운 HttpClient(핸들러, disposeHandler: false)를 사용하여 HttpClient 인스턴스를 생성하세요.
위의 접근법은 IHttpClientFactory와 유사한 방식으로 자원 관리 문제를 해결합니다.
- HttpClient 인스턴스 간의 소켓 HttpHandler공유 연결。 이 공유는 소켓 고갈을 방지합니다.
- 소켓 HttpHandler는 DNS 정체성을 방지하기 위해 PooledConnectionLifetime을 기반으로 연결을 루프합니다.
더 자세한 사용 및 구성은 다음을 참고하시기 바랍니다:
하이퍼링크 로그인이 보입니다.
하이퍼링크 로그인이 보입니다.
|