我在抛出异常时在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测试。
答案 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 类在访问资源时发生错误时会抛出WebException。 WebException.Status属性包含一个WebExceptionStatus值,指示错误的来源。当WebException.Status为WebExceptionStatus.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)。