여러 API 서비스를위한 .Net Core HttpClientFactory

Sep 10 2020

약 4 개의 서로 다른 API 서비스에 연결해야하는 .Net Core 프로젝트가 있습니다. 저는 HttpClient 코드에 대한 전문가는 아니지만 일반적으로 하나의 인스턴스 만 재사용하기를 원한다는 사실을 발견했습니다. HttpClient의. 일반적인 합의에 따르면 Startup 클래스에 등록한 다음 DI를 사용하여 요청하여 .Net Core에서 HttpClientFactory를 사용하는 것입니다.

이제 대부분의 기본 헤더 등은 일반적으로 BaseAddress URL 외에 모두 동일합니다. 4 개의 diff API 서비스에 연결할 때 어떻게해야합니까? 4 개의 다른 명명 된 클라이언트를 등록하거나 모든 기본 정보가 미리 설정된 하나의 클라이언트를 보유한 다음 필요에 따라 수동으로 구성해야합니까 (예 : 주소 구성)?

일반적인 질문은 내가 이것에 대해 상당히 새롭기 때문에 HttpClient의 한 인스턴스를 재사용하는 것으로 알려져 있습니다.

  1. 각 API 서비스에 대해 4 개의 서로 다른 명명 된 클라이언트를 만드는 경우 .CreateClient () 메서드를 호출 할 때 HttpClient의 4 개의 인스턴스가 생성되지 않습니까?
  2. .CreateClient ()는 호출 될 때마다 새 인스턴스를 생성합니다. 하나의 API 서비스에 대해 세 번의 다른 호출을해야하는 경우 HttpClient의 하나의 인스턴스를 갖는 목적을 무효화하지 않습니다. 각 호출은. CreateClient ()를 사용하여 일종의 연결을 설정하면 HttpClient의 3 개의 인스턴스가 생성됩니다.

명확성을 위해 도움을 주시면 감사하겠습니다.

감사!

답변

2 scharnyw Sep 10 2020 at 14:01

사용 목적은의 IHttpClientFactory인스턴스를 재사용 하는 것이 아닙니다 HttpClient. 대신 HTTP 연결 및 소켓을 관리하는 기본 개체 인 HttpMessageHandler(실제로 HttpClientHandlerabstract에서 파생 된 ) 인스턴스를 ( 풀링하여) 재사용 하는 것입니다 HttpMessageHandler. Microsoft Docs 의이 다이어그램 은이를 잘 보여줍니다.

를 자주 호출하면을 자주 호출 IHttpClientFactory.CreateClient()하는 것과 동일한 문제가 발생 할까 걱정했습니다 new HttpClient(). 그러나 이것은 사실이 아닙니다. Microsoft 문서 에서 설명했듯이 를 자주 호출하면 new HttpClient()소켓이 고갈 되는 이유 는이 생성자가 다음의 새 인스턴스를 만들기 때문입니다 HttpMessageHandler.

그러나 문제는 실제로 HttpClient 자체가 아니라 HttpClient의 기본 생성자를 사용하여 발생합니다. HttpMessageHandler의 새로운 구체적인 인스턴스를 생성하기 때문입니다. HttpMessageHandler는 위에서 언급 한 소켓 고갈 및 DNS 변경 문제가있는 인스턴스입니다.

당신은에서 볼 수있는 소스 코드 의 IHttpClientFactory그것의 매개 변수가없는 생성자를 사용하지 않는다는 점 HttpClient에서 CreateClient(). 대신 HttpMessageHandler풀에서을 가져와 생성 된 HttpClient.

유형이 지정된 클라이언트를 사용하든 명명 된 클라이언트를 사용하든 HttpClient 인스턴스를 임시 객체 인 것처럼 사용해야합니다. 생성 비용이 저렴하고 오랜 시간 동안 캐시 할 필요가 없습니다.