다음을 통해 공유


HttpClientFactory는 SocketsHttpHandler를 기본 처리기로 사용합니다.

HttpClientFactory 를 사용하면 명명되고 형식화된 HttpMessageHandler HttpClient 개체에 대한 파이프라인을 구성할 수 있습니다. 가장 안쪽에 있는 처리기 또는 실제로 유선으로 요청을 보내는 처리기를 기본 처리기라고 합니다. 구성되지 않은 경우 이 처리기는 이전에 항상 HttpClientHandler. 기본 기본 처리기는 구현 세부 정보이지만 이를 사용하는 사용자가 있었습니다. 예를 들어 일부 사용자는 기본 처리기를 캐스팅하여 HttpClientHandler < a0/> 및 같은 UseCookiesClientCertificatesUseProxy속성을 설정합니다.

이 변경으로 기본 기본 처리기는 SocketsHttpHandler 이를 지원하는 플랫폼에 있습니다. 다른 플랫폼(예: .NET Framework) HttpClientHandler 에서는 계속 사용됩니다.

SocketsHttpHandler 이제 값과 PooledConnectionLifetime 일치하도록 미리 설정된 속성도 있습니다 HandlerLifetime . (사용자가 구성한 경우 HandlerLifetime 최신 값을 반영합니다).

도입된 버전

.NET 9 미리 보기 6

이전 동작

기본 기본 처리기는 HttpClientHandler. 속성을 업데이트하기 위해 HttpClientHandler 캐스팅하는 작업이 수행되었습니다.

services.AddHttpClient("test")
    .ConfigurePrimaryHttpMessageHandler((h, _) =>
    {
        ((HttpClientHandler)h).UseCookies = false;
    });

// This worked.
var client = httpClientFactory.CreateClient("test");

새 동작

지원되는 플랫폼에서 SocketsHttpHandler 기본 기본 처리기는 이제 SocketsHttpHandler 값으로 PooledConnectionLifetime 설정됩니다 HandlerLifetime . 속성을 InvalidCastException업데이트하도록 HttpClientHandler 캐스팅하면 .

예를 들어 이전 동작 섹션의 동일한 코드는 이제 다음을 InvalidCastExceptionthrow합니다.

System.InvalidCastException: 'System.Net.Http.SocketsHttpHandler' 형식의 개체를 'System.Net.Http.HttpClientHandler' 형식으로 캐스팅할 수 없습니다.

호환성이 손상되는 변경의 형식

이 변경 사항은 동작 변경입니다.

변경 이유

사용자가 발생하는 Named 가장 일반적인 문제 HttpClientFactory 중 하나는 단일 서비스에서 또는 Typed 클라이언트가 잘못 캡처되거나 일반적으로 지정된 HandlerLifetime기간보다 긴 기간 동안 어딘가에 저장되는 경우입니다. 이러한 처리기는 회전할 수 없으므로 HttpClientFactory 결국 DNS 변경 내용을 존중하지 않을 수 있습니다.

이 문제는 제어PooledConnectionLifetime할 수 있는 옵션이 있는 을 사용하여 SocketsHttpHandler완화할 수 있습니다. 마찬가지로 HandlerLifetime풀링된 연결 수명을 사용하면 정기적으로 연결을 다시 만들어 DNS 변경 내용을 선택할 수 있지만 하위 수준에서는 선택할 수 있습니다. 설정된 클라이언트 PooledConnectionLifetime 는 싱글톤으로 안전하게 사용할 수 있습니다.

불행히도 클라이언트를 싱글톤에 삽입 Typed 하는 것은 쉽고 겉보기에 "직관적"입니다. 그러나 캡처되지 않아야 할 때 캡처되지 않도록 확인하기 HttpClient 위해 어떤 종류의 검사 또는 분석기를 갖기 어렵습니다. 결과 문제를 해결하기도 어렵습니다. 따라서 잘못된 사용 패턴 SocketsHttpHandler 의 잠재적 영향을 최소화하기 위한 예방 조치로 이제 완화가 기본적으로 적용됩니다.

이 변경 내용은 최종 사용자가 사용자 지정 PrimaryHandler 을 사용하도록 클라이언트를 구성하지 않은 경우에만 영향을 줍니다(예: 통해 ConfigurePrimaryHttpMessageHandler<THandler>(IHttpClientBuilder)).

호환성이 손상되는 변경을 해결하는 세 가지 옵션이 있습니다.

  • 각 클라이언트에 대한 기본 처리기를 명시적으로 지정하고 구성합니다.

    services.AddHttpClient("test")
      .ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler() { UseCookies = false });
    
  • 다음을 사용하여 ConfigureHttpClientDefaults(IServiceCollection, Action<IHttpClientBuilder>)모든 클라이언트에 대한 기본 기본 처리기를 덮어씁니다.

    services.ConfigureHttpClientDefaults(b =>
      b.ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler() { UseCookies = false }));
    
  • 구성 작업에서 다음을 모두 HttpClientHandler SocketsHttpHandler확인합니다.

    services.AddHttpClient("test")
      .ConfigurePrimaryHttpMessageHandler((h, _) =>
      {
          if (h is HttpClientHandler hch)
          {
              hch.UseCookies = false;
          }
    
          if (h is SocketsHttpHandler shh)
          {
              shh.UseCookies = false;
          }
      });
    

영향을 받는 API