Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
              HttpClientFactory gör att du kan konfigurera en HttpMessageHandler pipeline för namngivna HttpClient och inskrivna objekt. Den inre mest hanteraren, eller den som faktiskt skickar begäran på tråden, kallas för en primär hanterare. Om den inte har konfigurerats var den här hanteraren tidigare alltid en HttpClientHandler. Den primära standardhanteraren är en implementeringsinformation, men det fanns användare som var beroende av den. Vissa användare till exempel omvandlar den primära hanteraren till HttpClientHandler för att ange egenskaper som ClientCertificates, UseCookiesoch UseProxy.
Med den här ändringen är den primära standardhanteraren en SocketsHttpHandler på plattformar som stöder den. På andra plattformar, till exempel .NET Framework, HttpClientHandler fortsätter att användas.
              SocketsHttpHandler har nu också egenskapsförinställningen PooledConnectionLifetime för att matcha HandlerLifetime värdet. (Det återspeglar det senaste värdet, om HandlerLifetime det har konfigurerats av användaren).
Version introducerad
Förhandsversion 6 av .NET 9
Tidigare beteende
Den primära standardhanteraren var HttpClientHandler. Det råkade fungera genom att lägga till den för HttpClientHandler att uppdatera egenskaperna.
services.AddHttpClient("test")
    .ConfigurePrimaryHttpMessageHandler((h, _) =>
    {
        ((HttpClientHandler)h).UseCookies = false;
    });
// This worked.
var client = httpClientFactory.CreateClient("test");
Nytt beteende
På plattformar där SocketsHttpHandler stöds är den primära standardhanteraren nu SocketsHttpHandler inställd PooledConnectionLifetime på HandlerLifetime värdet. När du genererar den till HttpClientHandler för att uppdatera egenskaperna utlöser en InvalidCastException.
Till exempel genererar samma kod från avsnittet Föregående beteende nu en InvalidCastException:
System.InvalidCastException: Det går inte att casta objekt av typen "System.Net.Http.SocketsHttpHandler" för att skriva "System.Net.Http.HttpClientHandler".
Typ av icke-bakåtkompatibel ändring
Den här ändringen är en beteendeförändring.
Orsak till ändringen
Ett av de vanligaste problemen HttpClientFactory som användarna stöter på är när en eller Named en Typed klient felaktigt fångas in i en singleton-tjänst, eller i allmänhet lagras någonstans under en tidsperiod som är längre än den angivna HandlerLifetime. Eftersom HttpClientFactory det inte går att rotera sådana hanterare kanske de inte respekterar DNS-ändringar.
Det här problemet kan åtgärdas med hjälp SocketsHttpHandlerav , som har ett alternativ för att styra PooledConnectionLifetime. 
              HandlerLifetimePå samma sätt kan den poolade anslutningslivslängden regelbundet återskapa anslutningar för att hämta DNS-ändringar, men på en lägre nivå. En klient med PooledConnectionLifetime konfigurerad kan användas på ett säkert sätt som en singleton.
Det är tyvärr enkelt och till synes "intuitivt" att mata in en Typed klient i en singleton. Men det är svårt att ha någon form av kontroll eller analysator för att se HttpClient till att den inte fångas när den inte skulle fångas. Det är också svårt att felsöka de resulterande problemen. Som ett förebyggande mått – för att minimera den potentiella effekten av felaktiga användningsmönster – tillämpas begränsningen SocketsHttpHandler nu som standard.
Den här ändringen påverkar endast fall då klienten inte har konfigurerats av slutanvändaren att använda en anpassad PrimaryHandler (till exempel via ConfigurePrimaryHttpMessageHandler<THandler>(IHttpClientBuilder)).
Rekommenderad åtgärd
Det finns tre alternativ för att kringgå den icke-bakåtkompatibla ändringen:
Ange och konfigurera uttryckligen en primär hanterare för var och en av dina klienter:
services.AddHttpClient("test") .ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler() { UseCookies = false });Skriv över den primära standardhanteraren för alla klienter med hjälp av ConfigureHttpClientDefaults(IServiceCollection, Action<IHttpClientBuilder>):
services.ConfigureHttpClientDefaults(b => b.ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler() { UseCookies = false }));I konfigurationsåtgärden söker du efter både
HttpClientHandlerochSocketsHttpHandler:services.AddHttpClient("test") .ConfigurePrimaryHttpMessageHandler((h, _) => { if (h is HttpClientHandler hch) { hch.UseCookies = false; } if (h is SocketsHttpHandler shh) { shh.UseCookies = false; } });