代码之家  ›  专栏  ›  技术社区  ›  Eric Schoonover thSoft

正在读取自定义httpwebresponse状态描述?

  •  3
  • Eric Schoonover thSoft  · 技术社区  · 15 年前

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

    下面是我在小提琴手中看到的反应。所以我知道我的自定义消息会被推回到调用者那里。我不明白的是如何从.NET中检索该消息。statusDescription不包含此字符串。

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

    HTTP/1.1 500 消息:“引发了类型为”Exceptions.DataSourceNotFoundException“的异常。”URI: http://www.test1.com/
    内容长度:0
    服务器:Microsoft HTTPAPI/2.0
    日期:2009年4月20日周一07:13:40格林尼治标准时间

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

    4 回复  |  直到 15 年前
        1
  •  2
  •   Eric Schoonover thSoft    15 年前

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

    catch(WebException ex)
    {
        string message = ((HttpWebResponse)ex.Response).StatusDescription;
    }
    
        2
  •  3
  •   Arjan    15 年前

    我多年来一直没有使用.NET,但在Java中,人们通常希望得到HTTP代码和消息,因为404没有发现错误,而404s实际上使Java抛出文件名。对于这些情况,在Java中应该使用 HttpURLConnection#getErrorStream 而不是 #getResponseMessage .

    那么:可能在一个.NET客户端中发生了类似的事情,需要500个响应?的确 documentation for HttpWebRequest 国家:

    这个 HTTPWebRebug 类抛出 WebException 当访问资源时发生错误时。这个 WebException.Status 属性包含 WebExceptionStatus 指示错误来源的值。什么时候? Web异常。状态 WebExceptionStatus.ProtocolError , the Response 属性包含 HttpWebResponse 从资源接收。

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

    重要提示:请注意,这不使用 GetResponse HTTPWebRebug 但是 响应 网络异常 :

    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);
    }
    
        3
  •  0
  •   Sean Turner    15 年前

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

        4
  •  0
  •   JLamb    15 年前

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

    大多数原因代码都是一些没有“:”和引号的单词: http://tools.ietf.org/html/rfc2616#section-6.1.1 因此,我怀疑头部解析器认为“message:”是HTTP头部的开始(请检查webresponse.headers[“message”])。

    您可以添加一个标题(比如x-error-details)。