Estoy construyendo una biblioteca de clases para interactuar con una API. Necesito llamar a la API y procesar la respuesta XML. Puedo ver los beneficios del uso HttpClientpara la conectividad asincrónica, pero lo que estoy haciendo es puramente sincrónico, por lo que no puedo ver ningún beneficio significativo sobre el uso HttpWebRequest.
Si alguien puede arrojar alguna luz, lo agradecería enormemente. No soy de los que usan las nuevas tecnologías por el bien de ellas.
c#
asp.net
dotnet-httpclient
Salsa de tomate
fuente
fuente

Respuestas:
Puede usar
HttpClientpara solicitudes síncronas muy bien:En cuanto a por qué debería usar
HttpClientover,WebRequestse trata, bueno,HttpClientes el nuevo chico en el bloque y podría contener mejoras sobre el antiguo cliente.fuente
string responseString = Task.Run(() => responseContent.ReadAsStringAsync()).Result;si debe hacer esto sincrónico.Task.Runinvoca la tarea desde un ThreadPool, pero está solicitando.Resultque elimine todos los beneficios de esto y bloquee el hilo en el que lo llamó.Result(que generalmente es el hilo principal de la interfaz de usuario)..Resultasí puede agotar el conjunto de hilos y causar un punto muerto.new TaskFactory(TaskScheduler.FromCurrentSynchronizationContext()Reiteraría la respuesta de Donny V. y la de Josh
(Y votar si tuviera la reputación).
No recuerdo la última vez si alguna vez, agradecí el hecho de que HttpWebRequest arrojó excepciones para los códigos de estado> = 400. Para solucionar estos problemas, debe detectar las excepciones de inmediato y asignarlas a algunos mecanismos de respuesta que no sean excepciones. en su código ... aburrido, tedioso y propenso a errores en sí mismo. Ya sea que se comunique con una base de datos o que implemente un proxy web a medida, es 'casi' siempre deseable que el controlador Http solo le diga a su código de aplicación lo que se devolvió y le deje a usted decidir cómo comportarse.
Por lo tanto, HttpClient es preferible.
fuente
HttpClientsí mismo sea una envolturaHttpWebRequest(que de hecho, atrapa internamente esosWebExceptionobjetos y hace la conversión a aHttpResponseMessagepor ti). Pensé que sería más fácil crear un nuevo cliente desde cero.Si está creando una biblioteca de clase, entonces quizás los usuarios de su biblioteca deseen usar su biblioteca de forma asincrónica. Creo que esa es la razón más importante allí mismo.
Tampoco sabes cómo se usará tu biblioteca. Quizás los usuarios procesarán muchas y muchas solicitudes, y hacerlo de forma asincrónica lo ayudará a funcionar de manera más rápida y eficiente.
Si puede hacerlo simplemente, trate de no cargar con la carga a los usuarios de su biblioteca que intentan hacer que el flujo sea asíncrono cuando pueda encargarse de ellos.
La única razón por la que no usaría la versión asincrónica es si intentara admitir una versión anterior de .NET que aún no tiene soporte asincrónico incorporado.
fuente
En mi caso, la respuesta aceptada no funcionó. Estaba llamando a la API desde una aplicación MVC que no tenía acciones asíncronas.
Así es como logré hacerlo funcionar:
Entonces lo llamé así:
fuente
Luego
si usa esa clase, pase su método asíncrono como parámetro, puede llamar a los métodos asíncronos desde los métodos de sincronización de manera segura.
se explica aquí: https://cpratt.co/async-tips-tricks/
fuente
Todas las respuestas parecen centrarse en el uso
HttpClientsincrónico en lugar de dar una respuesta real a la pregunta.HttpClientes más que un simple controlador de solicitud / respuesta, por lo que puede tratar algunas peculiaridades de diferentes redes. Es decir, en mi caso, trabajar con proxy NTLM que requiere negociación, enviando múltiples solicitudes / respuestas con tokens y credenciales entre el cliente y el servidor proxy para autenticar.HttpClient(usandoHttpClientHandler) parece tener un mecanismo incorporado que maneja que devuelve recursos más allá del proxy con una llamada al método.fuente