3

引发异常时,我正在 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 测试版中测试。

4

4 回答 4

4

不是 .NET 程序员,在 msdn 上找到了这个

catch(WebException ex)
{
    string message = ((HttpWebResponse)ex.Response).StatusDescription;
}
于 2009-04-29T06:39:14.240 回答
3

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

那么:对于 500 个响应,可能在 .NET 客户端中发生了类似的事情?事实上,国家的文件HttpWebRequest

当访问资源时发生错误时,HttpWebRequest类会引发WebException 。WebException.Status属性包含指示错误来源的 WebExceptionStatus。当WebException.StatusWebExceptionStatus.ProtocolError时,Response属性包含从资源接收到的HttpWebResponse 。

详细信息:Response上面的链接是指WebException.Response,而不是HttpWebRequest.GetResponse。所以,WebException有自己的Response财产。以下示例基于WebException.Response文档,但我没有对其进行测试。

重要提示:请注意,这不使用GetResponsefrom HttpWebRequest,而是Responsefrom 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);
}
于 2009-04-29T16:18:48.543 回答
1

我认为您的问题是您的状态代码为 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

于 2009-04-30T11:01:45.537 回答
0

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

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

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

于 2009-05-02T09:26:01.350 回答