Provavelmente estou perdendo algo óbvio aqui.
Estou usando o HttpClient
que lança HttpRequestException
que contém StatusCode
na string Message.
Como posso acessar isso StatusCode
?
Edit : Mais informações, escrevi esta pergunta com pressa.
Estou usando HttpClient
para acessar outra API dentro do meu projeto WebApi. Sim, eu sei por que estou ligando EnsureSuccessStatusCode()
. Desejo propagar alguns erros posteriores, como 404 e 403.
Tudo o que eu queria era me transformar de forma consistente HttpRequestException
no HttpResponseException
uso personalizado ExceptionFilterAttribute
.
Infelizmente, HttpRequestException
não contém nenhuma informação extra que eu possa usar além da mensagem. Eu esperava descobrir StatusCode
na forma bruta (int ou enum).
Parece que posso:
- Use a mensagem para mudar o código de status (bleh)
- Ou crie minha versão de EnsureSuccessStatusCode e lança uma exceção que é realmente utilizável.
Respostas:
O código de status foi passado como parte de uma string para, de
HttpRequestException
modo que você não pode recuperá-lo apenas de tais exceções.O design do
System.Net.Http
requer que você acesse emHttpResponseMessage.StatusCode
vez de esperar pela exceção.http://msdn.microsoft.com/en-us/library/system.net.http.httpresponsemessage(v=vs.110).aspx
Se agora você está seguindo o guia da Microsoft , certifique-se de entender claramente por que ele pede para você ligar
HttpResponseMessage.EnsureSucessStatusCode
. Se você não chamar essa função, não deve haver exceção.fonte
Para valer a pena, esse cara fez algo inteligente: https://social.msdn.microsoft.com/Forums/vstudio/en-US/dc9bc426-1654-4319-a7fb-383f00b68def/c-httpresponsemessage-throws-exception-httprequestexception -webexception-the-remote-name? forum = csharpgeneral
No caso de eu precisar de uma propriedade de status de exceção, posso fazer o seguinte:
catch (HttpRequestException requestException) { if (requestException.InnerException is WebException webException && webException.Status == WebExceptionStatus.NameResolutionFailure) { return true; } return false; }
fonte
requestException.InnerException
é nula, então não funcionaráComo mencionado por outros também, não é uma boa prática obter o StatusCode de HttpRequestException, o mesmo pode ser feito de antemão com HttpResponseMessage.StatusCode após verificar HttpResponseMessage.IsSuccessStatusCode
De qualquer forma, se devido a alguma restrição / requisito for necessário ler StatusCode, pode haver duas soluções
Abaixo está o código em System.Net.Http.HttpResponseMessage Onde SR.net_http_message_not_success_statuscode = "Código de status de resposta não indica sucesso: {0} ({1})."
public HttpResponseMessage EnsureSuccessStatusCode() { if (!this.IsSuccessStatusCode) { if (this.content != null) { this.content.Dispose(); } throw new HttpRequestException(string.Format(CultureInfo.InvariantCulture, SR.net_http_message_not_success_statuscode, new object[] { (int)this.statusCode, this.ReasonPhrase })); } return this; }
fonte
Isso tem funcionado para mim
var response = ex.Response; var property = response.GetType().GetProperty("StatusCode"); if ( property != null && (HttpStatusCode)property.GetValue(response) == HttpStatusCode.InternalServerError)
fonte