Estou em uma situação em que, quando recebo um código HTTP 400 do servidor, é uma maneira completamente legal do servidor me dizer o que havia de errado com minha solicitação (usando uma mensagem no conteúdo da resposta HTTP)
No entanto, o .NET HttpWebRequest gera uma exceção quando o código de status é 400.
Como eu manejo isso? Para mim, um 400 é completamente legal e bastante útil. O conteúdo HTTP tem algumas informações importantes, mas a exceção me tira do meu caminho.
.net
httpwebrequest
chefsmart
fonte
fonte
Respostas:
Seria bom se houvesse alguma maneira de desativar o "código de ativação sem êxito", mas se você capturar o WebException, pode pelo menos usar a resposta:
Você pode encapsular o bit "me dê uma resposta mesmo que não seja um código de sucesso" em um método separado. (Eu sugiro que você ainda jogue se não houver uma resposta, por exemplo, se você não conseguir se conectar.)
Se a resposta do erro for grande (o que é incomum), convém ajustar
HttpWebRequest.DefaultMaximumErrorResponseLength
para garantir que você receba o erro inteiro.fonte
Sei que isso já foi respondido há muito tempo, mas criei um método de extensão para ajudar outras pessoas que chegam a essa pergunta.
Código:
Uso:
fonte
WebException.Response
pode e pode sernull
. Você deve repetir se for esse o caso.HttpClient
vez disso, é muito mais configurável e acredito que seja o caminho do futuro.((WebRequest) null).GetResponseWithoutException()
de fato, não causará aNullReferenceException
, uma vez que é compilado com o equivalente aWebRequestExtensions.GetResponseWithoutException(null)
, o que não resultaria em aNullReferenceException
, daí a necessidade de validação de entrada.Curiosamente, o
HttpWebResponse.GetResponseStream()
que você obtém doWebException.Response
não é o mesmo que o fluxo de resposta que você teria recebido do servidor. Em nosso ambiente, estamos perdendo respostas reais do servidor quando um código de status HTTP 400 é retornado ao cliente usando osHttpWebRequest/HttpWebResponse
objetos. Pelo que vimos, o fluxo de resposta associado aoWebException's HttpWebResponse
é gerado no cliente e não inclui nenhum corpo de resposta do servidor. Muito frustrante, pois queremos enviar uma mensagem ao cliente sobre o motivo da solicitação incorreta.fonte
Tive problemas semelhantes ao tentar me conectar ao serviço OAuth2 do Google.
Acabei escrevendo o POST manualmente, sem usar o WebRequest, assim:
A resposta que é gravada no fluxo de resposta contém o texto de erro específico que você procura.
Em particular, meu problema era que eu estava colocando linhas finais entre dados codificados em url. Quando os tirei, tudo funcionou. Você pode usar uma técnica semelhante para se conectar ao seu serviço e ler o texto real do erro de resposta.
fonte
Tente isso (é código VB :-):
fonte
Uma versão assíncrona da função de extensão:
fonte
Isso resolveu para mim:
https://gist.github.com/beccasaurus/929007/a8f820b153a1cfdee3d06a9c0a1d7ebfced8bb77
TL; DR:
Problema: o
host local retorna o conteúdo esperado, o IP remoto altera o conteúdo de 400 para "Solicitação incorreta"
Solução:
Adicionando
<httpErrors existingResponse="PassThrough"></httpErrors>
paraweb.config/configuration/system.webServer
resolver isso para mim; agora todos os servidores (local e remoto) retornam exatamente o mesmo conteúdo (gerado por mim), independentemente do endereço IP e / ou código HTTP que eu retorno.fonte