¿Cuál es el patrón de uso de HttpResponseMessage.EnsureSuccessStatusCode()
? Elimina el contenido del mensaje y lo lanza HttpRequestException
, pero no veo cómo manejarlo programáticamente de manera diferente a un genérico Exception
. Por ejemplo, no incluye el HttpStatusCode
, que habría sido útil.
¿Hay alguna forma de obtener más información? ¿Alguien podría mostrar un patrón de uso relevante de ambos EnsureSuccessStatusCode()
y HttpRequestException?
fuente
(int)response.StatusCode
(Ver msdn.microsoft.com/en-us/library/… )No me gusta GuaranteeSuccessStatusCode ya que no devuelve nada significativo. Por eso he creado mi propia extensión:
El código fuente para SecureSuccessStatusCode de Microsoft se puede encontrar aquí.
Versión sincrónica basada en el enlace SO :
Lo que no me gusta de IsSuccessStatusCode es que no es "agradablemente" reutilizable. Por ejemplo, puede usar una biblioteca como polly para repetir una solicitud en caso de un problema de red. En ese caso, necesita su código para generar una excepción para que polly o alguna otra biblioteca pueda manejarlo ...
fuente
EnsureSuccessStatusCode
. Siempre elimina elresponse.Content
(porque finalmente se llama siempre incluso después de lareturn;
declaración) y destruye el contenido para su posterior lectura. La implementación original elimina el contenido solo cuando el código de estado no indica un resultado exitoso.await response.Content.ReadAsStringAsync()
y luego revisaif (response.Content != null)
HttpRequest
llamadas y configurar la política para manejar ciertas excepciones y ciertosHttpResponseCode
correos electrónicos. Vea el ejemplo en el archivo Léame de Polly aquíresponse.Content
ser nulo cuando se le acaba de llamar a un método?Utilizo SecureSuccessStatusCode cuando no quiero manejar la excepción con el mismo método.
La excepción lanzada en GetUserIdAsync se manejará en DoSomethingAsync.
fuente
A continuación se muestra mi solución propuesta. El único defecto es que, dado que el administrador de recursos del marco ASP.NET Core es interno del marco, no puedo reutilizar directamente las cadenas de mensajes internacionalizadas de Microsoft, por lo que solo estoy usando el literal de mensaje en inglés literal aquí.
Pros
ConfigureTestContainer<T>
Contras
response.EnsureSuccessStatusCode();
y deje que el servidor se encargue de ello.Content
propiedad antes de verificar el estado. Puede haber situaciones en las que esto no sea deseable, una de las cuales es la ineficiencia.Uso
API
fuente