Este artículo es un artículo espejo de traducción automática, por favor haga clic aquí para saltar al artículo original.

Vista: 9666|Respuesta: 7

[Fuente] ASP.NET Core (XV) utiliza HttpClient para enviar solicitudes HTTP

[Copiar enlace]
Publicado en 14/5/2022 19:37:21 | | | |
Al construir una aplicación con ASP.NET, se utiliza una instancia de la clase HttpClient para hacer una solicitud HTTP. Usar HttpClient puede parecer sencillo. Sin embargo, algunos posibles problemas no se detectan hasta que la aplicación está bajo una carga elevada.

Problemas relacionados con la clase HttpClient original proporcionada en .NET:El inicio de sesión del hipervínculo es visible.

HttpClient, aunque implementa IDisposable, declararlo e instanciarlo en la instrucción using no es una operación preferida, porqueAl liberar un objeto HttpClient, el socket subyacente no lo haceal instanteLanzamiento, lo que puede causar problemas de agotamiento de la cavidad.

El problema no es realmente HttpClient en sí, sino el constructor predeterminado de HttpClient, ya que crea una nueva instancia real de HttpMessageHandler con los problemas de "agotamiento de sockets" y cambios DNS mencionados anteriormente.



Crear HttpClient directamente (uso incorrecto)

Instancia directamente el objeto HttpClient y suma using para garantizar la llamada al método Dispos, el código es el siguiente:

Llama a la interfaz 5 veces, envía una solicitud HTTP usando HttpClient y comprueba la conexión de red con el siguiente comando:

Se puede ver que cuando se libera el HttpClient, la conexión entre el ordenador local y el servidor objetivo esTIME_WAITEn caso de alta concurrencia, el error se informará de la siguiente manera:

No se puede conectar al servidor remoto
System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted.


Para preguntas, también puedes consultar a:

Usar HttpClinet incorrectamente puede romper tu software
https://www.itsvse.com/thread-10310-1-1.html
Crear un HttpClinet con IHttpClientFactory (uso correcto)

Usando la inyección de dependencias DI, IHttpClientFactory es lo mismo que HttpLinet, que se crea usando IHttpClientFactory.

Añade el servicio al archivo de arranque, el código es el siguiente:

El código del controlador de HomeController es el siguiente:

También usamos HttpClinet para enviar 5 solicitudes a través de la interfaz de llamada, y la máquina solo establece una conexión con el servidor objetivo, y la conexión se reutiliza durante el proceso de solicitud. Como se muestra a continuación:



IHttpClientFactory agrupa instancias HttpMessageHandler creadas en fábrica en un pool para reducir el consumo de recursos. Cuando creas una nueva instancia HttpClient, puedes reutilizar la instancia HttpMessageHandler en el pool si el tiempo de vida no ha expirado.

{
    "Lifetime": "Singleton",
    "ServiceType": "System.Net.Http.IHttpClientFactory",
    "TypeImplementation": "Microsoft.Extensions.Http.DefaultHttpClientFactory"
  },
  {
    "Lifetime": "Singleton",
    "ServiceType": "System.Net.Http.IHttpMessageHandlerFactory",
    "TypeImplementation": "Microsoft.Extensions.Http.DefaultHttpClientFactory"
  }
IHttpClientFactory se implementa por defecto como DefaultHttpClientFactory, con la dirección del código fuente:El inicio de sesión del hipervínculo es visible.

Al usar IHttpClientFactory en una aplicación habilitada para DI, puedes evitar:

  • Resuelve el problema del agotamiento de recursos compartiendo la instancia HttpMessageHandler.
  • Resuelve la estadía del DNS pasando periódicamente por las instancias de HttpMessageHandler.


Además, existen otras formas de resolver los problemas anteriores utilizando instancias SocketsHttpHandler de larga duración.

  • Crea una instancia de SocketsHttpHandler al iniciar la app y úsala durante todo el ciclo de vida de la app.
  • Configura PooledConnectionLifetime al valor adecuado según el tiempo de refresco del DNS.
  • Crea una instancia de HttpClient usando el nuevo HttpClient (handler, disposeHandler: false) según sea necesario.


El enfoque anterior resuelve problemas de gestión de recursos de manera similar a IHttpClientFactory.

  • SocketsHttpHandler entre las instancias HttpClientConexiones compartidas。 Este compartir evita el agotamiento de los vasos.
  • SocketsHttpHandler hace bucles de conexiones basadas en PooledConnectionLifetime para evitar que el DNS se quede obsoleto.


Para más uso y configuración, por favor consulte:

El inicio de sesión del hipervínculo es visible.
El inicio de sesión del hipervínculo es visible.





Anterior:Usar HttpClient incorrectamente puede romper tu software
Próximo:Plugin de internacionalización jQuery Datatables
 Propietario| Publicado en 14/5/2022 19:38:14 |
revisión

ASP.NET Core (catorce) está basado en el captcha de imagen SkiaSharp
https://www.itsvse.com/thread-10287-1-1.html

ASP.NET Core (XIII) para determinar si es una solicitud Ajax o no
https://www.itsvse.com/thread-10284-1-1.html

ASP.NET Core (doce) JS front-end, empaquetado y compresión CSS
https://www.itsvse.com/thread-10282-1-1.html

ASP.NET ruta Core (XI) añade middleware para mostrar todos los servicios DI
https://www.itsvse.com/thread-10269-1-1.html

ASP.NET Explicación detallada de las prioridades de configuración en Core(10).
https://www.itsvse.com/thread-10265-1-1.html

ASP.NET Explicación detallada del middleware Middleware de Core (9).
https://www.itsvse.com/thread-9647-1-1.html

ASP.NET Explicación detallada del Middleware Core
https://www.itsvse.com/thread-8126-1-1.html

ASP.NET pozo de los parámetros predeterminados de la interfaz Swagger en Core(8).
https://www.itsvse.com/thread-9640-1-1.html

ASP.NET Núcleo (7) Análisis en profundidad del código fuente del framework
https://www.itsvse.com/thread-9601-1-1.html

ASP.NET Core (VI) DI obtiene manualmente el método de inyectar objetos
https://www.itsvse.com/thread-9595-1-1.html

ASP.NET Core (cinco) se basa en transacciones distribuidas CAP
https://www.itsvse.com/thread-9593-1-1.html

ASP.NET Validación unificada de modelos de modelo del filtro Core(4)
https://www.itsvse.com/thread-9589-1-1.html

ASP.NET Core (iii) Crear dinámicamente instancias usando ActivatorUtilities
https://www.itsvse.com/thread-9488-1-1.html

ASP.NET Núcleo (2) Reiniciar la aplicación por código
https://www.itsvse.com/thread-9480-1-1.html

ASP.NET Core (1) utiliza caché Redis
https://www.itsvse.com/thread-9393-1-1.html
 Propietario| Publicado en 14/5/2022 19:41:13 |
Código fuente de HttpClientHandler:https://github.com/dotnet/runtim ... andler.AnyMobile.cs
Código fuente de SocketsHttpHandler:https://github.com/dotnet/runtim ... obalHttpSettings.cs
Publicado en 14/5/2022 22:36:06 |
Apréndelo
Publicado en 19/5/2022 9:45:12 |
Aquí viene, echa un vistazo a la secuela
Publicado en 18/8/2022 16:13:45 |
Aprendizaje y aprendizaje increíble
 Propietario| Publicado en 24/6/2023 13:07:32 |
.NET/C# HttpClient análisis sencillo del código fuente
https://www.itsvse.com/thread-10617-1-1.html
 Propietario| Publicado en 5/9/2024 14:35:55 |
Consulta el código fuente de HttpClientFactoryServiceCollectionExtensions

La implementación predeterminada de IHttpClientFactory esDefaultHttpClientFactory, como se muestra en la figura siguiente:



El método CreateClient en DefaultHttpClientFactory instancia el objeto HttpClientdisposeHandler: false, como se muestra en la figura siguiente:



Renuncia:
Todo el software, materiales de programación o artículos publicados por Code Farmer Network son únicamente para fines de aprendizaje e investigación; El contenido anterior no se utilizará con fines comerciales o ilegales; de lo contrario, los usuarios asumirán todas las consecuencias. La información de este sitio proviene de Internet, y las disputas de derechos de autor no tienen nada que ver con este sitio. Debes eliminar completamente el contenido anterior de tu ordenador en un plazo de 24 horas desde la descarga. Si te gusta el programa, por favor apoya el software genuino, compra el registro y obtén mejores servicios genuinos. Si hay alguna infracción, por favor contáctanos por correo electrónico.

Mail To:help@itsvse.com