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 uživatelem PooledConnectionLifetime a připojení dokončilo poslední přidružený požadavek (pokud existuje), připojení se zavře. Pokud ve frontě čekají nějaké požadavky, vytvoří se podle potřeby nové připojení.
15minutový interval byl vybrán pro ilustraci libovolně. Měli byste zvolit hodnotu na základě očekávané frekvence DNS nebo jiných změn sítě.
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.
Doporučené použití
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+:
static
HttpClient PooledConnectionLifetime 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í IHttpClientFactory
pokynů.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
socketHandler
pro . - Předá
socketHandler
logikuresilienceHandler
opakování do logiky opakování. HttpClient
Vytvoří instanci daného objekturesilienceHandler
.
Důležité
Knihovna Microsoft.Extensions.Http.Resilience
je aktuálně označená jako experimentální a v budoucnu se může změnit.