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 HttpClient
para 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
HttpClient
para solicitudes síncronas muy bien:En cuanto a por qué debería usar
HttpClient
over,WebRequest
se trata, bueno,HttpClient
es 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.Run
invoca la tarea desde un ThreadPool, pero está solicitando.Result
que 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)..Result
así 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
HttpClient
sí mismo sea una envolturaHttpWebRequest
(que de hecho, atrapa internamente esosWebException
objetos y hace la conversión a aHttpResponseMessage
por 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
HttpClient
sincrónico en lugar de dar una respuesta real a la pregunta.HttpClient
es 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