Aracılığıyla paylaş


HttpClientFactory, birincil işleyici olarak SocketsHttpHandler kullanır

HttpClientFactoryadlandırılmış ve yazılan HttpMessageHandler nesneler için bir HttpClient işlem hattı yapılandırmanıza olanak tanır. En iç işleyicisi veya isteği gerçekten kabloya gönderen işleyici birincil işleyici olarak adlandırılır. Yapılandırılmamışsa, bu işleyici önceden her zaman bir HttpClientHandler... Varsayılan birincil işleyici bir uygulama ayrıntısı olsa da, buna bağımlı olan kullanıcılar vardı. Örneğin, bazı kullanıcılar , HttpClientHandlerve ClientCertificatesgibi UseCookiesözellikleri ayarlamak için birincil işleyiciyi olarak UseProxy yayınlar.

Bu değişiklikle, varsayılan birincil işleyici onu destekleyen platformlarda bir SocketsHttpHandler olur. .NET Framework HttpClientHandler gibi diğer platformlarda kullanılmaya devam eder.

SocketsHttpHandler artık değerle PooledConnectionLifetime eşleşecek özellik ön ayarına HandlerLifetime da sahiptir. (Kullanıcı tarafından yapılandırıldıysa HandlerLifetime en son değeri yansıtır).

Sürüm kullanıma sunulmuştur

.NET 9 Önizleme 6

Önceki davranış

Varsayılan birincil işleyici idi HttpClientHandler. Özellikleri güncelleştirmek için bu HttpClientHandler özelliğin ataması işe yaramıştı.

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

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

Yeni davranış

Desteklenen platformlarda SocketsHttpHandler varsayılan birincil işleyici artık SocketsHttpHandlerPooledConnectionLifetime değerine ayarlanmıştır HandlerLifetime . Özellikleri güncelleştirmek için öğesine HttpClientHandler atama, bir InvalidCastExceptionoluşturur.

Örneğin, Önceki davranış bölümündeki aynı kod şimdi bir InvalidCastExceptionoluşturur:

System.InvalidCastException: 'System.Net.Http.SocketsHttpHandler' türünde bir nesne 'System.Net.Http.HttpClientHandler' türüne oluşturulamıyor.

Hataya neden olan değişikliğin türü

Bu değişiklik davranışsal bir değişikliktir.

Değişiklik nedeni

Kullanıcıların karşılaştığı en yaygın sorunlardan HttpClientFactory biri, bir Named veya Typed istemcisinin hatalı bir şekilde tek bir hizmette yakalanması veya genel olarak belirtilenden HandlerLifetimedaha uzun bir süre boyunca bir yerde depolanmasıdır. Bu HttpClientFactory tür işleyicileri döndüremediği için DNS değişikliklerine saygı duymayabilirler.

Bu sorun, denetimi SocketsHttpHandleriçin bir seçeneğe sahip olan kullanılarak PooledConnectionLifetimeazaltılabilir. benzer şekilde HandlerLifetime, havuza alınan bağlantı ömrü, DNS değişikliklerini almak için bağlantıların düzenli olarak yeniden oluşturmasına izin verir, ancak daha düşük bir düzeydedir. Kurulumu olan PooledConnectionLifetime bir istemci, tekil olarak güvenli bir şekilde kullanılabilir.

Ne yazık ki, bir Typed istemciyi tek bir istemciye eklemek kolay ve görünüşte "sezgisel". Ancak yakalanmaması gereken durumlarda yakalanmadığından emin olmak HttpClient için herhangi bir kontrol veya analiz cihazına sahip olmak zordur. Sonuçta ortaya çıkan sorunları gidermek de zordur. Bu nedenle, hatalı kullanım desenlerinin SocketsHttpHandler olası etkisini en aza indirmek için önleyici bir ölçü olarak, azaltma varsayılan olarak uygulanır.

Bu değişiklik yalnızca istemcinin özel PrimaryHandler bir kullanıcı tarafından (örneğin aracılığıyla ConfigurePrimaryHttpMessageHandler<THandler>(IHttpClientBuilder)) kullanılacak şekilde yapılandırılmadığı durumları etkiler.

Hataya neden olan değişikliği geçici olarak çözmek için üç seçenek vardır:

  • İstemcilerinizin her biri için birincil işleyiciyi açıkça belirtin ve yapılandırın:

    services.AddHttpClient("test")
      .ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler() { UseCookies = false });
    
  • kullanarak ConfigureHttpClientDefaults(IServiceCollection, Action<IHttpClientBuilder>)tüm istemciler için varsayılan birincil işleyicinin üzerine yaz:

    services.ConfigureHttpClientDefaults(b =>
      b.ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler() { UseCookies = false }));
    
  • Yapılandırma eyleminde hem hem HttpClientHandlerde SocketsHttpHandler öğesini denetleyin:

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

Etkilenen API’ler