阅读自定义HttpWebResponse StatusDescription?

时间:2009-04-20 07:27:23

标签: .net wcf rest httpwebresponse status

我在抛出异常时在RESTful WCF服务中设置自定义StatusDescription。它旨在为调用者提供友好的描述,说明他们获取失败状态代码的原因。

以下是我在Fiddler中看到的回应。所以我知道我的自定义消息被推回到调用者。我无法弄清楚的是如何从.NET中检索该消息。 StatusDescription不包含此字符串。

如果你能提供一些简单的示例代码。

  

HTTP / 1.1 500 消息:“抛出了类型'Exceptions.DataSourceNotFoundException'的异常。” Uri:http://www.test1.com/
  内容长度:0
  服务器:Microsoft-HTTPAPI / 2.0
  日期:2009年4月20日星期一07:13:40 GMT

更新
这个问题的答案在Silverlight中不起作用。在Silverlight 2和3 beta测试。

4 个答案:

答案 0 :(得分:3)

不是.NET程序员,在msdn上找到它

catch(WebException ex)
{
    string message = ((HttpWebResponse)ex.Response).StatusDescription;
}

答案 1 :(得分:3)

我多年没有使用过.NET,但在Java中,人们常常希望获得404 Not Found错误的HTTP代码和消息,而404实际上会让Java抛出FileNotFoundException。对于这些情况,在Java中,应使用HttpURLConnection#getErrorStream而不是#getResponseMessage

所以:在.NET客户端中可能会发生类似的事情,500个响应?确实documentation for HttpWebRequest州:

  

HttpWebRequest 类在访问资源时发生错误时会抛出WebExceptionWebException.Status属性包含一个WebExceptionStatus值,指示错误的来源。当WebException.StatusWebExceptionStatus.ProtocolError时,Response属性包含从资源收到的HttpWebResponse

详情:上面Response的链接指的是WebException.Response,而不是HttpWebRequest.GetResponse。因此,WebException具有自己的Response属性。以下示例基于WebException.Response文档,但我没有对其进行测试。

重要提示:请注意,这不会使用GetResponse中的HttpWebRequest,而是使用来自Response的{​​{1}}:

WebException

答案 2 :(得分:0)

我认为你的问题是你的状态代码是500.当状态代码不正常(200或某种类型的重定向)时,WebRequest.GetResponse()调用会在.NET中抛出WebException。

此异常实际上包含具有StatusDescription集的HttpWebResponse对象。以下示例来自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);
        }
    }

来源:http://msdn.microsoft.com/en-us/library/system.net.httpwebresponse.statuscode.aspx

要实际获得状态,您需要从异常本身获取HttpWebResponse对象:

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);
}

来源:http://msdn.microsoft.com/en-us/library/system.net.webexception.status.aspx

答案 3 :(得分:0)

我不知道它是复制/粘贴的东西,但是“Uri:”标题与状态代码位于同一行 - 这可能是一个问题。

大多数原因代码是没有“:”且没有引号的几个单词:http://tools.ietf.org/html/rfc2616#section-6.1.1所以我怀疑标题解析器认为“Message:”是HTTP标头的开头(检查webResponse.Headers [ “消息”])。

您可以添加标题(例如,X-Error-Details)。