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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top