Este artigo é um artigo espelhado de tradução automática, por favor clique aqui para ir para o artigo original.

Vista: 9666|Resposta: 7

[Fonte] ASP.NET Core (XV) usa HttpClient para enviar requisições HTTP

[Copiar link]
Publicado em 14/05/2022 19:37:21 | | | |
Ao construir uma aplicação com ASP.NET, uma instância da classe HttpClient é usada para fazer uma requisição HTTP. Usar o HttpClient pode parecer simples. No entanto, alguns problemas potenciais só são percebidos quando a aplicação está sob grande carga.

Questões relacionadas à classe HttpClient original fornecida no .NET:O login do hiperlink está visível.

HttpClient, ao implementar IDisposable, declará-lo e instancia-lo na instrução using não é uma operação preferida, porqueAo liberar um objeto HttpClient, o socket subjacente não é liberadoinstantaneamentesoltar, que pode causar problemas de exaustão do soquete.

O problema não é realmente o HttpClient em si, mas o construtor padrão do HttpClient, pois ele cria uma nova instância real do HttpMessageHandler com os problemas de "exaustão de socket" e mudanças de DNS mencionados acima.



Criando o HttpClient diretamente (uso incorreto)

Instanciando diretamente o objeto HttpClient e adicionando usando para garantir a chamada ao método Dispose, o código é o seguinte:

Chame a interface 5 vezes, envie uma requisição HTTP usando o HttpClient e verifique a conexão de rede com o seguinte comando:

Você pode ver que, quando o HttpClient é liberado, a conexão entre o computador local e o servidor alvo éTIME_WAITNo caso de alta concorrência, o erro será reportado da seguinte forma:

Não consegui se conectar ao servidor remoto
System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted.


Para perguntas, você também pode consultar a:

Usar o HttpClinet incorretamente pode quebrar seu software
https://www.itsvse.com/thread-10310-1-1.html
Crie um HttpClinet com IHttpClientFactory (uso correto)

Usando injeção de dependência DI, IHttpClientFactory é o mesmo que HttpLinet, que é criado usando IHttpClientFactory.

Adicione o serviço ao arquivo Inicial, o código é o seguinte:

O código do controlador do HomeController é o seguinte:

Também usamos o HttpClinet para enviar 5 requisições pela interface de chamada, e a máquina só estabelece uma conexão com o servidor alvo, e a conexão é reutilizada durante o processo de solicitação. Como mostrado abaixo:



O IHttpClientFactory agrupa instâncias HttpMessageHandler criadas em fábrica em um pool para reduzir o consumo de recursos. Quando você cria uma nova instância HttpClient, pode reutilizar a instância HttpMessageHandler no pool se o tempo de vida ainda não tiver expirado.

{
    "Vitalícia": "Singleton",
    "ServiceType": "System.Net.Http.IHttpClientFactory",
    "TypeImplementation": "Microsoft.Extensions.Http.DefaultHttpClientFactory"
  },
  {
    "Vitalícia": "Singleton",
    "ServiceType": "System.Net.Http.IHttpMessageHandlerFactory",
    "TypeImplementation": "Microsoft.Extensions.Http.DefaultHttpClientFactory"
  }
IHttpClientFactory é implementado por padrão como DefaultHttpClientFactory, com o endereço do código-fonte:O login do hiperlink está visível.

Ao usar o IHttpClientFactory em uma aplicação habilitada para DI, você pode evitar:

  • Resolva o problema do esgotamento de recursos compartilhando a instância HttpMessageHandler.
  • Resolva o enrolamento do DNS passando periodicamente por instâncias do HttpMessageHandler.


Além disso, existem outras formas de resolver os problemas acima usando instâncias SocketsHttpHandler de longa duração.

  • Crie uma instância do SocketsHttpHandler na inicialização do app e use-a durante todo o ciclo de vida do app.
  • Configure o PooledConnectionLifetime para o valor apropriado com base no tempo de atualização do DNS.
  • Crie uma instância de HttpClient usando o novo HttpClient (handler, disposeHandler: false) conforme necessário.


A abordagem acima resolve problemas de gerenciamento de recursos de forma semelhante ao IHttpClientFactory.

  • SocketsHttpHandler entre as instâncias HttpClientConexões compartilhadas。 Esse compartilhamento evita a exaustão do soquete.
  • SocketsHttpHandler faz loops de conexões com base no PooledConnectionLifetime para evitar o enrolamento do DNS.


Para mais uso e configuração, consulte a:

O login do hiperlink está visível.
O login do hiperlink está visível.





Anterior:Usar o HttpClient de forma incorreta pode quebrar seu software
Próximo:Plugin de internacionalização jQuery Datatables
 Senhorio| Publicado em 14/05/2022 19:38:14 |
revisar

ASP.NET Core (quatorze) é baseado no captcha de imagem SkiaSharp
https://www.itsvse.com/thread-10287-1-1.html

ASP.NET Core (XIII) para determinar se é uma requisição Ajax ou não
https://www.itsvse.com/thread-10284-1-1.html

ASP.NET Core (doze) front-end JS, agrupamento e compressão de CSS
https://www.itsvse.com/thread-10282-1-1.html

ASP.NET rota de endpoint Core (XI) adiciona middleware para exibir todos os serviços DI
https://www.itsvse.com/thread-10269-1-1.html

ASP.NET Explicação detalhada das prioridades de configuração no Core(10).
https://www.itsvse.com/thread-10265-1-1.html

ASP.NET Explicação detalhada do middleware Middleware do Core (9).
https://www.itsvse.com/thread-9647-1-1.html

ASP.NET Explicação detalhada do Middleware Core
https://www.itsvse.com/thread-8126-1-1.html

ASP.NET dos parâmetros padrão da interface Swagger no Core(8).
https://www.itsvse.com/thread-9640-1-1.html

ASP.NET Core (7) Análise aprofundada do código-fonte do framework
https://www.itsvse.com/thread-9601-1-1.html

ASP.NET Core (VI) DI obtém manualmente o método de injeção de objetos
https://www.itsvse.com/thread-9595-1-1.html

ASP.NET Core (cinco) é baseado em transações distribuídas CAP
https://www.itsvse.com/thread-9593-1-1.html

ASP.NET Validação unificada do modelo ModelState do filtro Core(4)
https://www.itsvse.com/thread-9589-1-1.html

ASP.NET Core (iii) Criar instâncias dinamicamente usando ActivatorUtilities
https://www.itsvse.com/thread-9488-1-1.html

ASP.NET Núcleo (2) Reiniciar a aplicação por código
https://www.itsvse.com/thread-9480-1-1.html

ASP.NET Core (1) usa cache Redis
https://www.itsvse.com/thread-9393-1-1.html
 Senhorio| Publicado em 14/05/2022 19:41:13 |
Publicado em 14/05/2022 22:36:06 |
Aprenda
Publicado em 19/05/2022 09:45:12 |
Lá vem, confira a sequência
Publicado em 18/08/2022 16:13:45 |
Aprendizado incrível
 Senhorio| Publicado em 24/06/2023 13:07:32 |
.NET/C# HttpClient análise simples do código-fonte
https://www.itsvse.com/thread-10617-1-1.html
 Senhorio| Publicado em 05/09/2024 14:35:55 |
Confira o código-fonte HttpClientFactoryServiceCollectionExtensions

A implementação padrão do IHttpClientFactory éDefaultHttpClientFactory, como mostrado na figura abaixo:



O método CreateClient em DefaultHttpClientFactory instancia o objeto HttpClientdisposeHandler: false, como mostrado na figura abaixo:



Disclaimer:
Todo software, material de programação ou artigos publicados pela Code Farmer Network são apenas para fins de aprendizado e pesquisa; O conteúdo acima não deve ser usado para fins comerciais ou ilegais, caso contrário, os usuários terão todas as consequências. As informações deste site vêm da Internet, e disputas de direitos autorais não têm nada a ver com este site. Você deve deletar completamente o conteúdo acima do seu computador em até 24 horas após o download. Se você gosta do programa, por favor, apoie um software genuíno, compre o registro e obtenha serviços genuínos melhores. Se houver qualquer infração, por favor, entre em contato conosco por e-mail.

Mail To:help@itsvse.com