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
.NET