Při sestavování aplikace pomocí ASP.NET se instance třídy HttpClient používá k odeslání HTTP požadavku. Používání HttpClient se může zdát jednoduché. Některé potenciální problémy však nejsou zaznamenány, dokud není aplikace pod velkým zatížením.
Problémy související s původní třídou HttpClient poskytovanou v .NET:Přihlášení k hypertextovému odkazu je viditelné.
HttpClient, při implementaci IDisposable, deklarování a instancování v příkazu using není preferovanou operací, protožePři uvolnění objektu HttpClient základní socket ne.okamžitěuvolnit, což může způsobovat problémy s vyčerpáním lůžka.
Problém není ve skutečnosti samotný HttpClient, ale výchozí konstruktor HttpClientu, protože vytváří novou skutečnou instanci HttpMessageHandleru s výše zmíněnými problémy se změnou socketu a "socket exhaustion" a DNS.
Přímé vytvoření HttpClient (nesprávné použití)
Instancujte přímo objekt HttpClient a přidejte using pro zajištění volání metody Dispose, kód je následující:
Zavolejte rozhraní 5krát, pošlete HTTP požadavek pomocí HttpClient a zkontrolujte síťové spojení následujícím příkazem:
Vidíte, že když je HttpClient uvolněn, spojení mezi lokálním počítačem a cílovým serverem jeTIME_WAITV případě vysoké souběžnosti bude chyba hlášena následovně:
Nemohu se připojit k vzdálenému serveru
System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted.
Pro otázky se můžete také podívat na:
Vytvořte HttpClinet pomocí IHttpClientFactory (správné použití)
Použitím DI injekce závislostí je IHttpClientFactory stejný jako HttpLinet, který je vytvořen pomocí IHttpClientFactory.
Přidejte službu do Startup souboru, kód je následující:
Kód ovladače HomeController je následující:
Používáme také HttpClinet k odeslání 5 požadavků přes rozhraní volání, přičemž stroj naváže spojení pouze s cílovým serverem, přičemž spojení je během procesu požadavku znovu použito. Jak je uvedeno níže:
IHttpClientFactory sdružuje továrně vytvořené instance HttpMessageHandlerů do jednoho poolu, aby snížil spotřebu zdrojů. Když vytvoříte novou instanci HttpClient, můžete instanci HttpMessageHandler znovu použít v poolu, pokud životnost nevypršela.
{ "Lifetime": "Singleton", "ServiceType": "System.Net.Http.IHttpClientFactory", "ImplementationType": "Microsoft.Extensions.Http.DefaultHttpClientFactory" }, { "Lifetime": "Singleton", "ServiceType": "System.Net.Http.IHttpMessageHandlerFactory", "ImplementationType": "Microsoft.Extensions.Http.DefaultHttpClientFactory" } IHttpClientFactory je ve výchozím nastavení implementován jako DefaultHttpClientFactory s adresou zdrojového kódu:Přihlášení k hypertextovému odkazu je viditelné.
Použitím IHttpClientFactory v aplikaci s podporou DI se můžete vyhnout:
- Vyřešit problém vyčerpání zdrojů sdílením instance HttpMessageHandler.
- Vyřešte zastaralost DNS pravidelným cyklováním instancí HttpMessageHandler.
Kromě toho existují i jiné způsoby, jak výše uvedené problémy řešit pomocí instancí SocketsHttpHandler s dlouhou životností.
- Vytvořte instanci SocketsHttpHandler při spuštění aplikace a používejte ji po celou dobu jejího životního cyklu.
- Nakonfigurujte PooledConnectionLifetime na odpovídající hodnotu podle doby obnovy DNS.
- Vytvořte instanci HttpClient pomocí nového HttpClient(handler, disposeHandler: false) podle potřeby.
Výše uvedený přístup řeší problémy správy zdrojů podobně jako IHttpClientFactory.
- SocketsHttpHandler mezi instancemi HttpClientSdílená spojení。 Toto sdílení zabraňuje vyčerpání lůžka.
- SocketsHttpHandler smyčí spojení na základě PooledConnectionLifetime, aby se předešlo zastaralosti DNS.
Pro více využití a konfigurace se prosím podívejte na:
Přihlášení k hypertextovému odkazu je viditelné.
Přihlášení k hypertextovému odkazu je viditelné.
|