Estoy en una situación en la que cuando obtengo un código HTTP 400 del servidor, es una forma completamente legal de que el servidor me diga qué estuvo mal con mi solicitud (usando un mensaje en el contenido de la respuesta HTTP)
Sin embargo, .NET HttpWebRequest genera una excepción cuando el código de estado es 400.
¿Cómo manejo esto? Para mí, un 400 es completamente legal y bastante útil. El contenido HTTP tiene información importante, pero la excepción me saca de mi camino.
.net
httpwebrequest
chefsmart
fuente
fuente
Respuestas:
Sería bueno si hubiera alguna forma de desactivar "lanzar código sin éxito", pero si detecta WebException, al menos puede usar la respuesta:
Es posible que desee encapsular el bit "obtenme una respuesta incluso si no es un código de éxito" en un método separado. (Te sugiero que sigas lanzando si no hay una respuesta, por ejemplo, si no puedes conectarte).
Si la respuesta de error puede ser grande (lo cual es inusual), es posible que desee ajustar
HttpWebRequest.DefaultMaximumErrorResponseLength
para asegurarse de obtener el error completo.fuente
Sé que esto ya ha sido respondido hace mucho tiempo, pero hice un método de extensión para ayudar a otras personas a responder esta pregunta.
Código:
Uso:
fuente
WebException.Response
puede y puede sernull
. Debería volver a lanzar si este es el caso.HttpClient
lugar, es mucho más configurable y creo que es el camino del futuro.((WebRequest) null).GetResponseWithoutException()
de hecho, no causará aNullReferenceException
, ya que se compila al equivalente deWebRequestExtensions.GetResponseWithoutException(null)
, lo que no daría como resultado aNullReferenceException
, de ahí la necesidad de validación de entrada.Curiosamente, lo
HttpWebResponse.GetResponseStream()
que obtienes delWebException.Response
no es lo mismo que el flujo de respuesta que hubieras recibido del servidor. En nuestro entorno, estamos perdiendo respuestas reales del servidor cuando se devuelve un código de estado 400 HTTP al cliente utilizando losHttpWebRequest/HttpWebResponse
objetos. Por lo que hemos visto, el flujo de respuesta asociado con elWebException's HttpWebResponse
se genera en el cliente y no incluye ninguno de los cuerpos de respuesta del servidor. Muy frustrante, ya que queremos enviarle un mensaje al cliente el motivo de la mala solicitud.fuente
Tuve problemas similares al intentar conectarme al servicio OAuth2 de Google.
Terminé escribiendo el POST manualmente, sin usar WebRequest, así:
La respuesta que se escribe en la secuencia de respuesta contiene el texto de error específico que está buscando.
En particular, mi problema era que estaba poniendo líneas finales entre los datos codificados en URL. Cuando los saqué, todo funcionó. Es posible que pueda utilizar una técnica similar para conectarse a su servicio y leer el texto de error de respuesta real.
fuente
Pruebe esto (es el código VB :-):
fuente
Una versión asincrónica de la función de extensión:
fuente
Esto lo resolvió para mí:
https://gist.github.com/beccasaurus/929007/a8f820b153a1cfdee3d06a9c0a1d7ebfced8bb77
TL; DR:
Problema:
localhost devuelve el contenido esperado, la IP remota altera el contenido de 400 a "Mala solicitud"
Solución:
Agregar
<httpErrors existingResponse="PassThrough"></httpErrors>
aweb.config/configuration/system.webServer
resolver esto por mí; ahora todos los servidores (locales y remotos) devuelven exactamente el mismo contenido (generado por mí) independientemente de la dirección IP y / o el código HTTP que devuelvo.fuente