Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 正在读取自定义HttpWebResponse状态描述?_.net_Wcf_Rest_Httpwebresponse_Status - Fatal编程技术网

.net 正在读取自定义HttpWebResponse状态描述?

.net 正在读取自定义HttpWebResponse状态描述?,.net,wcf,rest,httpwebresponse,status,.net,Wcf,Rest,Httpwebresponse,Status,当抛出异常时,我正在RESTful WCF服务中设置自定义StatusDescription。这是为了给调用者提供一个友好的描述,说明他们为什么会得到故障状态码 下面是我在Fiddler中看到的反应。因此,我知道我的自定义消息将被推回到调用方。我搞不懂的是如何从.NET检索该消息。StatusDescription不包含此字符串 如果您能提供一个简单的示例代码,那就太好了 HTTP/1.1500消息:“引发了类型为“Exceptions.DataSourceNotFoundException”的

当抛出异常时,我正在RESTful WCF服务中设置自定义StatusDescription。这是为了给调用者提供一个友好的描述,说明他们为什么会得到故障状态码

下面是我在Fiddler中看到的反应。因此,我知道我的自定义消息将被推回到调用方。我搞不懂的是如何从.NET检索该消息。StatusDescription不包含此字符串

如果您能提供一个简单的示例代码,那就太好了

HTTP/1.1500消息:“引发了类型为“Exceptions.DataSourceNotFoundException”的异常。”Uri:
内容长度:0
服务器:Microsoft HTTPAPI/2.0
日期:2009年4月20日星期一07:13:40 GMT

更新

这个问题的答案在Silverlight中不起作用。在Silverlight 2和3测试版中进行了测试。

不是.NET程序员,在msdn上发现了这一点

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

我已经很多年没有使用.NET了,但在Java中,人们通常希望得到404未发现错误的HTTP代码和消息,而404实际上让Java抛出FileNotFoundException。对于这些情况,在Java中应该使用而不是
#getResponseMessage

那么:在一个.NET客户机上,500个响应可能会发生类似的事情?实际上,各国:

HttpWebRequest类在访问资源时发生错误时抛出错误。属性包含一个指示错误来源的值。当为时,属性包含从资源接收的

详细信息:上面指向
响应
的链接指的是
WebException.Response
,而不是to。因此,
WebException
有自己的
Response
属性。下面的示例基于文档,但我没有测试它

重要提示:请注意,这并不使用来自
HttpWebRequest
GetResponse
,而是来自
WebException
Response

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

我认为你的问题是你的身份代码是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);
        }
    }
资料来源:

要实际获取状态,需要从异常本身获取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);
}

来源:

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

大多数原因码都是几个没有“:”和引号的单词:因此我怀疑标头解析器认为“Message:”是HTTP标头的开始(请检查webResponse.Headers[“Message”])


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

Errrr,这与以前的答案有什么不同?@spoon16,请解释一下为什么您更改了这个错误的答案,然后将其作为最佳答案?