personalizado Reading HttpWebResponse StatusDescription?
-
12-09-2019 - |
Pergunta
Eu estou definindo um StatusDescription personalizado em um serviço RESTful WCF quando uma exceção é lançada. É concebido para fornecer o chamador com uma descrição amigável de por que eles tem o código de status de falha.
A seguir é a resposta que eu vejo em Fiddler. Então eu sei que a minha mensagem personalizada está sendo empurrado para trás até o chamador. O que eu não consigo entender é como recuperar essa mensagem de .NET. faz o StatusDescription não contém esta cadeia.
Se você poderia fornecer um pouco simples de código de exemplo que seria ótimo.
HTTP / 1.1 500 Mensagem: "Exceção do tipo 'Exceptions.DataSourceNotFoundException' foi lançada." Uri: http://www.test1.com/
Content-Length: 0
Servidor: Microsoft-HTTPAPI / 2.0
Data: Mon, 20 de abril de 2009 07:13:40 GMT
Atualizar
A resposta a esta pergunta não funciona no Silverlight. Testado no Silverlight 2 e 3 beta.
Solução
Não é um programador .NET, achou esta no MSDN
catch(WebException ex)
{
string message = ((HttpWebResponse)ex.Response).StatusDescription;
}
Outras dicas
Eu não usei .NET em muitos anos, mas em Java pessoas muitas vezes esperar para obter um código HTTP e mensagem de erro 404 não encontrado, enquanto 404s realmente fazer Java lançar uma FileNotFoundException. Para essas situações, em Java deve-se usar HttpURLConnection#getErrorStream
em vez de #getResponseMessage
.
Assim: talvez algo semelhante está acontecendo em um cliente .NET para 500 respostas? Na verdade, o documentação para estados HttpWebRequest
:
O HttpWebRequest classe lança um WebException quando ocorrem erros ao acessar um recurso. A WebException.Status propriedade contém um < a href = "http://msdn.microsoft.com/en-us/library/system.net.webexceptionstatus.aspx" rel = "nofollow noreferrer"> WebExceptionStatus valor que indica a origem do erro. Quando WebException.Status é WebExceptionStatus.ProtocolError , a propriedade Response contém o HttpWebResponse recebido do recurso.
Detalhe: o link para Response
acima refere-se WebException.Response
, não para HttpWebRequest.GetResponse
. Então, WebException
tem a sua própria propriedade Response
. O exemplo a seguir é baseado no WebException.Response
documentação, mas eu não testá-lo.
IMPORTANTE: nota que isso não utilizar GetResponse
de HttpWebRequest
, mas Response
de WebException
:
try {
HttpWebRequest myHttpWebRequest =
(HttpWebRequest) WebRequest.Create("http://www.example.org/not_found");
HttpWebResponse myHttpWebResponse =
(HttpWebResponse) myHttpWebRequest.GetResponse();
myHttpWebResponse.Close();
}
catch(WebException e) {
Console.WriteLine("Exception Message: " + e.Message);
if(e.Status == WebExceptionStatus.ProtocolError) {
Console.WriteLine("Status Code: {0}",
((HttpWebResponse)e.Response).StatusCode);
Console.WriteLine("Status Description: {0}",
((HttpWebResponse)e.Response).StatusDescription);
}
}
catch(Exception e) {
Console.WriteLine(e.Message);
}
Eu acho que o problema é que seu código de status é 500. Quando o código de status não é OK (200 ou algum tipo de redirecionamento), WebRequest.GetResponse () chamada lança um WebException em .NET.
Esta excepção irá realmente conter o objeto HttpWebResponse com o conjunto StatusDescription. As amostras abaixo são do MSDN:
public static void GetPage(String url)
{
try
{
// Creates an HttpWebRequest for the specified URL.
HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);
// Sends the HttpWebRequest and waits for a response.
HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
if (myHttpWebResponse.StatusCode == HttpStatusCode.OK)
Console.WriteLine("\r\nResponse Status Code is OK and StatusDescription is: {0}",
myHttpWebResponse.StatusDescription);
// Releases the resources of the response.
myHttpWebResponse.Close();
}
catch(WebException e)
{
Console.WriteLine("\r\nWebException Raised. The following error occured : {0}",e.Status);
}
catch(Exception e)
{
Console.WriteLine("\nThe following Exception was raised : {0}",e.Message);
}
}
Fonte: http://msdn.microsoft .com / en-us / library / system.net.httpwebresponse.statuscode.aspx
Para realmente obter o status, você vai precisar para obter o objeto HttpWebResponse do próprio exceção:
try {
// Create a web request for an invalid site. Substitute the "invalid site" strong in the Create call with a invalid name.
HttpWebRequest myHttpWebRequest = (HttpWebRequest) WebRequest.Create("invalid site");
// Get the associated response for the above request.
HttpWebResponse myHttpWebResponse = (HttpWebResponse) myHttpWebRequest.GetResponse();
myHttpWebResponse.Close();
}
catch(WebException e) {
Console.WriteLine("This program is expected to throw WebException on successful run."+
"\n\nException Message :" + e.Message);
if(e.Status == WebExceptionStatus.ProtocolError) {
Console.WriteLine("Status Code : {0}", ((HttpWebResponse)e.Response).StatusCode);
Console.WriteLine("Status Description : {0}", ((HttpWebResponse)e.Response).StatusDescription);
}
}
catch(Exception e) {
Console.WriteLine(e.Message);
}
Fonte: http://msdn.microsoft .com / en-us / library / system.net.webexception.status.aspx
Eu não posso dizer se é um copy / paste coisa, mas o "Uri". Cabeçalho está na mesma linha que o código de status - que poderia ser um problema
A maioria dos códigos de razão são algumas palavras sem um ":" e sem aspas: http://tools.ietf.org/html/rfc2616#section-6.1.1 Então, eu suspeito que o analisador de cabeçalho pensa que "Mensagem:" é o início de um cabeçalho HTTP (webResponse.Headers de verificação [ "mensagem"]).
Você pode adicionar um cabeçalho (por exemplo, X-Error-Details) em vez.