Pokyny pro používání HttpClient

Třída System.Net.Http.HttpClient odesílá požadavky HTTP a přijímá odpovědi HTTP z prostředku identifikovaného identifikátorem URI. Instance HttpClient je kolekce nastavení, která se použijí pro všechny požadavky spuštěné danou instancí, a každá instance používá vlastní fond připojení, který izoluje své požadavky od ostatních. Počínaje verzí .NET Core 2.1 SocketsHttpHandler poskytuje třída implementaci a zajišťuje konzistentní chování napříč všemi platformami.

Chování DNS

HttpClient Překládá pouze záznamy DNS při vytvoření připojení. Nesleduje dobu trvání TTL (Time To Live) určenou serverem DNS. Pokud se položky DNS mění pravidelně, což se může stát v některých scénářích, klient tyto aktualizace nerespektuje. Chcete-li tento problém vyřešit, můžete omezit dobu životnosti připojení nastavením PooledConnectionLifetime vlastnosti, aby se vyhledávání DNS opakovalo při nahrazení připojení. Představte si následující příklad:

var handler = new SocketsHttpHandler
{
    PooledConnectionLifetime = TimeSpan.FromMinutes(15) // Recreate every 15 minutes
};
var sharedClient = new HttpClient(handler);

HttpClient Předchozí konfigurace je nakonfigurovaná tak, aby opakovaně používala připojení po dobu 15 minut. Po uplynutí časového intervalu zadaného PooledConnectionLifetime uživatelem se připojení zavře a vytvoří se nový.

Připojení ve fondu

Fond připojení pro objekt je HttpClient propojený s podkladovým SocketsHttpHandlerobjektem . HttpClient Když je instance uvolněna, odstraní všechna existující připojení uvnitř fondu. Pokud později odešlete požadavek na stejný server, je potřeba znovu vytvořit nové připojení. Výsledkem je snížení výkonu za nepotřebné vytváření připojení. Porty TCP navíc nejsou uvolněny okamžitě po uzavření připojení. (Další informace o tom naleznete v dokumentu TIME-WAIT RFC 9293.) Pokud je míra požadavků vysoká, může dojít k vyčerpání limitu operačního systému dostupných portů. Pokud se chcete vyhnout problémům s vyčerpáním portů, doporučujeme opakovaně používat HttpClient instance pro co nejvíce požadavků HTTP.

Pokud chcete shrnout doporučené HttpClient použití z hlediska správy životnosti, měli byste použít dlouhodobé klienty a nastavit PooledConnectionLifetime (.NET Core a .NET 5+) nebo krátkodobé klienty vytvořené IHttpClientFactory.

  • V .NET Core a .NET 5+:

    • staticHttpClientPooledConnectionLifetime V závislosti naočekávaných Tím se vyřeší vyčerpání portů i změny DNS, aniž by se přidaly režijní náklady IHttpClientFactory. Pokud potřebujete mít možnost napodobení obslužné rutiny, můžete ji zaregistrovat samostatně.

    Tip

    Pokud používáte pouze omezený počet HttpClient instancí, je to také přijatelná strategie. Záleží na tom, že nejsou vytvořené a uvolněné s každou žádostí, protože každý z nich obsahuje fond připojení. Použití více instancí je nezbytné pro scénáře s více proxy servery nebo pro oddělení kontejnerů souborů cookie bez úplné zakázání zpracování souborů cookie.

    • Použití IHttpClientFactory, můžete mít více, různě nakonfigurovaných klientů pro různé případy použití. Mějte však na paměti, že klienti vytvořené továrnou mají být krátkodobě a jakmile se klient vytvoří, továrna nad ním už nebude mít kontrolu.

      Instance fondů HttpMessageHandler továren a pokud jeho životnost nevypršela, může se obslužná rutina znovu použít z fondu, když továrna vytvoří novou HttpClient instanci. Tím se zabrání problémům s vyčerpáním soketů.

      Pokud si přejete konfigurovatelnost, která IHttpClientFactory poskytuje, doporučujeme použít přístup typu klient.

  • V rozhraní .NET Framework můžete spravovat IHttpClientFactory instance HttpClient . Pokud nepoužíváte továrnu a místo toho pro každou žádost sami vytvoříte novou instanci klienta, můžete vyčerpat dostupné porty.

    Tip

    Pokud vaše aplikace vyžaduje soubory cookie, zvažte zakázání automatického zpracování souborů cookie nebo zabránění IHttpClientFactory. Sdružování HttpMessageHandler instancí vede ke sdílení CookieContainer objektů. CookieContainer Neočekávané sdílení objektů často vede k nesprávnému kódu.

Další informace o správě HttpClient životnosti pomocí IHttpClientFactorypokynů.IHttpClientFactory

Odolnost pomocí statických klientů

Pomocí následujícího vzoru je možné nakonfigurovat static klienta nebo jednoho klienta tak, aby používal libovolný počet kanálů odolnosti:

using System;
using System.Net.Http;
using Microsoft.Extensions.Http;
using Microsoft.Extensions.Http.Resilience;
using Polly;

var retryPipeline = new ResiliencePipelineBuilder<HttpResponseMessage>()
    .AddRetry(new HttpRetryStrategyOptions
    {
        BackoffType = DelayBackoffType.Exponential,
        MaxRetryAttempts = 3
    })
    .Build();

var socketHandler = new SocketsHttpHandler
{
    PooledConnectionLifetime = TimeSpan.FromMinutes(15)
};
var resilienceHandler = new ResilienceHandler(retryPipeline)
{
    InnerHandler = socketHandler,
};

var httpClient = new HttpClient(resilienceHandler);

Předchozí kód:

  • Spoléhá na balíček NuGet Microsoft.Extensions.Http.Resilience .
  • Určuje přechodnou obslužnou rutinu chyby HTTP nakonfigurovanou s kanálem opakování, který při každém pokusu exponenciálně zpožďuje intervaly zpoždění.
  • Definuje životnost připojení ve fondu s patnácti minutami socketHandlerpro .
  • Předá socketHandler logiku resilienceHandler opakování do logiky opakování.
  • HttpClient Vytvoří instanci daného objektu resilienceHandler.

Důležité

Knihovna Microsoft.Extensions.Http.Resilience je aktuálně označená jako experimentální a v budoucnu se může změnit.

Viz také