Estou construindo uma biblioteca de classes para interagir com uma API. Preciso chamar a API e processar a resposta XML. Posso ver os benefícios de usar HttpClient
para conectividade assíncrona, mas o que estou fazendo é puramente síncrono, portanto, não vejo nenhum benefício significativo sobre o uso HttpWebRequest
.
Se alguém puder lançar alguma luz, eu apreciaria muito. Eu não sou do tipo que usa novas tecnologias por causa disso.
c#
asp.net
dotnet-httpclient
Ketchup
fonte
fonte
Respostas:
Você pode usar
HttpClient
para solicitações síncronas muito bem:No que diz respeito ao motivo pelo qual você deve usar o
HttpClient
excessoWebRequest
, bem,HttpClient
é o novo garoto do setor e pode conter melhorias em relação ao cliente antigo.fonte
string responseString = Task.Run(() => responseContent.ReadAsStringAsync()).Result;
se precisar tornar isso síncrono.Task.Run
invoca a tarefa a partir de um ThreadPool, mas você está solicitando que.Result
ela elimine todos os benefícios disso e bloqueie o segmento no qual você chamou isso.Result
(que geralmente é o principal thread da interface do usuário)..Result
assim pode esgotar o conjunto de threads e causar um conflito.new TaskFactory(TaskScheduler.FromCurrentSynchronizationContext()
Eu reiterava a resposta de Donny V. e a de Josh
(e voto positivo, se eu tivesse reputação.)
Não me lembro da última vez, fiquei grato pelo fato de o HttpWebRequest ter lançado exceções para códigos de status> = 400. Para contornar esses problemas, você precisa capturar as exceções imediatamente e mapeá-las para alguns mecanismos de resposta que não sejam de exceção no seu código ... chato, tedioso e propenso a erros em si. Seja comunicando-se com um banco de dados ou implementando um proxy da Web sob medida, é quase sempre desejável que o driver Http diga ao código do aplicativo o que foi retornado e deixe que você decida como se comportar.
Portanto, o HttpClient é preferível.
fonte
HttpClient
ele próprio seja um invólucroHttpWebRequest
(que de fato captura internamente essesWebException
objetos e faz a conversão para umHttpResponseMessage
para você). Eu teria pensado que seria mais fácil construir um novo cliente totalmente do zero.Se você estiver criando uma biblioteca de classes, talvez os usuários da sua biblioteca desejem usá-la de forma assíncrona. Eu acho que essa é a maior razão aqui.
Você também não sabe como sua biblioteca será usada. Talvez os usuários processem muitas e muitas solicitações, e fazê-lo de forma assíncrona ajudará a executar com mais rapidez e eficiência.
Se você puder fazer isso de forma simples, tente não sobrecarregar os usuários da sua biblioteca, tentando tornar o fluxo assíncrono quando puder cuidar dele.
O único motivo pelo qual eu não usaria a versão assíncrona é se eu estava tentando oferecer suporte a uma versão mais antiga do .NET que ainda não possui suporte assíncrono.
fonte
No meu caso, a resposta aceita não funcionou. Eu estava chamando a API de um aplicativo MVC que não tinha ações assíncronas.
Foi assim que consegui fazê-lo funcionar:
Então eu chamei assim:
fonte
Então
se você usar essa classe, passe seu método assíncrono como parâmetro, poderá chamar os métodos assíncronos de métodos sincronizados de maneira segura.
é explicado aqui: https://cpratt.co/async-tips-tricks/
fonte
Todas as respostas parecem focar no uso
HttpClient
síncrono, em vez de dar uma resposta real à pergunta.HttpClient
é mais do que um simples manipulador de solicitação / resposta, para que ele possa lidar com algumas peculiaridades de diferentes redes. Ou seja, no meu caso, trabalhando com o proxy NTLM, que requer negociação, enviando várias solicitações / respostas com tokens e credenciais entre o cliente e o servidor proxy para autenticação.HttpClient
(usingHttpClientHandler
) parece ter um mecanismo interno que lida com o retorno de recursos além do proxy com uma chamada de método.fonte