Ten artykuł jest lustrzanym artykułem tłumaczenia maszynowego, kliknij tutaj, aby przejść do oryginalnego artykułu.

Widok: 9666|Odpowiedź: 7

[Źródło] ASP.NET Core (XV) używa HttpClient do wysyłania żądań HTTP

[Skopiuj link]
Opublikowano 14.05.2022 19:37:21 | | | |
Podczas budowania aplikacji z ASP.NET, instancja klasy HttpClient jest używana do wykonania żądania HTTP. Korzystanie z HttpClient może wydawać się proste. Jednak niektóre potencjalne problemy nie są zauważane, dopóki aplikacja nie jest obciążona dużym obciążeniem.

Problemy związane z oryginalną klasą HttpClient udostępnioną w .NET:Logowanie do linku jest widoczne.

HttpClient, podczas implementacji IDisposable, deklarowania i instancji w instrukcji using nie jest preferowaną operacją, ponieważPodczas uwalniania obiektu HttpClient, bazowe gniazdo nie jestnatychmiastzwolnić, co może powodować problemy z wyczerpaniem gniazd.

Problemem nie jest sam HttpClient, lecz domyślny konstruktor HttpClient, ponieważ tworzy on nową, faktyczną instancję HttpMessageHandler z problemami "socket exhaustion" i zmianami DNS, o których wspomniano powyżej.



Tworzenie HttpClient bezpośrednio (nieprawidłowe użycie)

Instancjonuj obiekt HttpClient bezpośrednio i dodaj using aby zagwarantować wywołanie do metody Dispose, kod wygląda następująco:

Wywołaj interfejs 5 razy, wyślij żądanie HTTP za pomocą HttpClient i sprawdź połączenie sieciowe za pomocą następującego polecenia:

Widać, że gdy HttpClient zostanie udostępniony, połączenie między komputerem lokalnym a serwerem docelowym jest następująceTIME_WAITW przypadku dużej równoległości błąd będzie raportowany w następujący sposób:

Nie mogę połączyć się z serwerem zdalnym
System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted.


W przypadku pytań możesz również odnieść się do:

Nieprawidłowe użycie HttpClinet może zepsuć oprogramowanie
https://www.itsvse.com/thread-10310-1-1.html
Utwórz HttpClinet za pomocą IHttpClientFactory (poprawne użycie)

Przy użyciu wstrzyknięcia zależności DI IHttpClientFactory jest tym samym co HttpLinet, który jest tworzony za pomocą IHttpClientFactory.

Dodaj usługę do pliku Startup, a kod wygląda następująco:

Kod kontrolera HomeController wygląda następująco:

Używamy także HttpClinet do wysyłania 5 żądań przez interfejs wywołań, a maszyna nawiązuje połączenie tylko z docelowym serwerem, a połączenie jest ponownie wykorzystywane podczas procesu żądania. Jak pokazano poniżej:



IHttpClientFactory łączy fabrycznie tworzone instancje HttpMessageHandler do puli, aby zmniejszyć zużycie zasobów. Gdy tworzysz nową instancję HttpClient, możesz ponownie użyć instancji HttpMessageHandler w puli, jeśli jej żywotność nie wygasła.

{
    "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 jest domyślnie zaimplementowany jako DefaultHttpClientFactory z adresem kodu źródłowego:Logowanie do linku jest widoczne.

Używając IHttpClientFactory w aplikacji z włączoną DI, możesz uniknąć:

  • Rozwiąż problem wyczerpania zasobów, udostępniając instancję HttpMessageHandler.
  • Rozwiązuj nieaktualność DNS, okresowo powtarzając instancje HttpMessageHandler.


Ponadto istnieją inne sposoby rozwiązania powyższych problemów, korzystając z długotrwałych instancji SocketsHttpHandler.

  • Stwórz instancję SocketsHttpHandler przy starcie aplikacji i używaj jej przez cały cykl życia.
  • Konfiguruj PooledConnectionLifetime do odpowiedniej wartości na podstawie czasu odświeżenia DNS.
  • Utworzenie instancji HttpClient przy użyciu nowego HttpClient(handler, disposeHandler: false) w razie potrzeby.


Powyższe podejście rozwiązuje problemy zarządzania zasobami podobnie jak IHttpClientFactory.

  • SocketsHttpHandler pomiędzy instancjami HttpClientPołączenia współdzielone。 To współdzielenie zapobiega wyczerpaniu gniazd.
  • SocketsHttpHandler zapętla połączenia oparte na PooledConnectionLifetime, aby uniknąć stagnacji DNS.


Więcej informacji o zastosowaniu i konfiguracji można znaleźć w:

Logowanie do linku jest widoczne.
Logowanie do linku jest widoczne.





Poprzedni:Nieprawidłowe używanie HttpClient może zepsuć oprogramowanie
Następny:wtyczka jQuery Datatables do internacjonalizacji
 Ziemianin| Opublikowano 14.05.2022 19:38:14 |
recenzja

ASP.NET Core (czternaście) opiera się na captcha obrazu SkiaSharp
https://www.itsvse.com/thread-10287-1-1.html

ASP.NET Core (XIII), aby określić, czy jest to żądanie Ajax, czy nie
https://www.itsvse.com/thread-10284-1-1.html

ASP.NET Core (dwanaście) front-end JS, bundling CSS i kompresja
https://www.itsvse.com/thread-10282-1-1.html

ASP.NET Core (XI) trasa końcowa dodaje oprogramowanie pośrednicze do wyświetlania wszystkich usług DI
https://www.itsvse.com/thread-10269-1-1.html

ASP.NET Szczegółowe wyjaśnienie priorytetów konfiguracji w Core(10).
https://www.itsvse.com/thread-10265-1-1.html

ASP.NET Szczegółowe wyjaśnienie middleware Middleware w Core (9).
https://www.itsvse.com/thread-9647-1-1.html

ASP.NET Szczegółowe wyjaśnienie Core Middleware
https://www.itsvse.com/thread-8126-1-1.html

ASP.NET domyślnych parametrów interfejsu Swagger w Core(8).
https://www.itsvse.com/thread-9640-1-1.html

ASP.NET Rdzeń (7) Dogłębna analiza kodu źródłowego frameworka
https://www.itsvse.com/thread-9601-1-1.html

ASP.NET Core (VI) DI ręcznie uzyskuje metodę wstrzykiwania obiektów
https://www.itsvse.com/thread-9595-1-1.html

ASP.NET Core (pięć) opiera się na rozproszonych transakcjach CAP
https://www.itsvse.com/thread-9593-1-1.html

ASP.NET Filtr Core(4) zunifikowany walidacja modelu modelu ModelState
https://www.itsvse.com/thread-9589-1-1.html

ASP.NET Rdzeń (iii) Dynamicznie twórz instancje za pomocą ActivatorUtilities
https://www.itsvse.com/thread-9488-1-1.html

ASP.NET Rdzeń (2) Restart aplikacji za pomocą kodu
https://www.itsvse.com/thread-9480-1-1.html

ASP.NET Core (1) korzysta z buforowania Redis
https://www.itsvse.com/thread-9393-1-1.html
 Ziemianin| Opublikowano 14.05.2022 19:41:13 |
Opublikowano 14.05.2022 22:36:06 |
Naucz się go
Opublikowano 19.05.2022 09:45:12 |
Nadchodzi, zobaczcie kontynuację
Opublikowano 18.08.2022 16:13:45 |
Niesamowita nauka i nauka
 Ziemianin| Opublikowano 24.06.2023 13:07:32 |
.NET/C# Kod źródłowy HttpClient – prosta analiza
https://www.itsvse.com/thread-10617-1-1.html
 Ziemianin| Opublikowano 05.09.2024 14:35:55 |
Sprawdź kod źródłowy HttpClientFactoryServiceCollectionExtensions

Domyślna implementacja IHttpClientFactory toDefaultHttpClientFactory, jak pokazano na poniższym rysunku:



Metoda CreateClient w DefaultHttpClientFactory instancjonuje obiekt HttpClientdisposeHandler: false, jak pokazano na poniższym rysunku:



Zrzeczenie się:
Całe oprogramowanie, materiały programistyczne lub artykuły publikowane przez Code Farmer Network służą wyłącznie celom edukacyjnym i badawczym; Powyższe treści nie mogą być wykorzystywane do celów komercyjnych ani nielegalnych, w przeciwnym razie użytkownicy ponoszą wszelkie konsekwencje. Informacje na tej stronie pochodzą z Internetu, a spory dotyczące praw autorskich nie mają z nią nic wspólnego. Musisz całkowicie usunąć powyższą zawartość z komputera w ciągu 24 godzin od pobrania. Jeśli spodoba Ci się program, wspieraj oryginalne oprogramowanie, kup rejestrację i korzystaj z lepszych, autentycznych usług. W przypadku naruszenia praw prosimy o kontakt mailowy.

Mail To:help@itsvse.com