Хочу прочитать статус 500 ошибок в .NET. Fiddler показывает мне читабельный ответ, почему я не могу войти в .NET? - PullRequest
0 голосов
/ 25 марта 2012

В Fiddler я могу передать запрос и получить ответ 500. Отлично, я хочу, чтобы мой .NET-код обрабатывал это и анализировал ответное сообщение.В случае ниже есть значимое сообщение.Тем не менее, используя HttpWebRequest и HttpWebResponse, я не могу получить эту информацию.

Вот ответ Fiddler:

HTTP/1.1 500 Internal Server Error
Date: Sun, 25 Mar 2012 15:50:31 GMT
Transfer-Encoding: chunked
Content-Type: text/xml; charset=ISO-8859-1
X-Powered-By: Servlet/2.5 JSP/2.1

010e
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><soap:Fault><faultcode>soap:Client</faultcode><faultstring>WSS header is missing from request. Can't do username token authentication.</faultstring></soap:Fault></soap:Body></soap:Envelope>
0000

Вот мой код, который пытается перехватить исключение:

        try
        {
            HttpWebResponse resp2 = (HttpWebResponse) req.GetResponse();
        }
        catch (WebException ex)
        {
            WebException we = (WebException) ex;
            HttpWebResponse respp = (HttpWebResponse) we.Response;
            log.Info((int)respp.StatusCode);
            log.Error(ex.ToString());
        }

Я просто не могу получить больше ничего от объекта исключения.Но я знаю, что ответ должен быть читабельным.Надеюсь, что я могу использовать http-классы более низкого уровня, о которых сейчас просто не знаю.Я не хочу, чтобы .NET защищал меня от настоящих протоколов HTTP.

Ответы [ 2 ]

3 голосов
/ 25 марта 2012

Непонятно, что вы пытались сделать с respp.(Я отмечаю, что вы тоже не используете resp2.) Например, что это делает:

catch (WebException ex)
{
    using (HttpWebResponse respp = (HttpWebResponse) ex.Response)
    {
        log.Info((int)respp.StatusCode);
        log.Error(ex.ToString());
        log.Error(new StreamReader(respp.GetResponseStream()).ReadToEnd());
    }
}

(Мне никогда не было ясно, нужно ли вам действительно )избавиться от WebResponse, полученного в WebException, но это, вероятно, хорошая идея. Возможно, вы захотите избавиться и от потока ответов, хотя я считаю, что удаление ответа достаточно хорошо.)

0 голосов
/ 25 марта 2012

Я думаю, что вы можете поймать SoapException вместо.

try
  {
    // do your thing
  }
  catch (SoapException soapEx)
  {
    MessageBox.Show(soapEx.Code.ToString());
    //Load the Detail element of the SoapException object
    XmlDocument doc = new XmlDocument();
    doc.LoadXml(soapEx.Detail.OuterXml);
    XmlNamespaceManager nsManager = new
      XmlNamespaceManager(doc.NameTable);
    // Add the namespace to the NamespaceManager
    nsManager.AddNamespace("errorNS",
      "WSSoapException");
    XmlNode Node =
      doc.DocumentElement.SelectSingleNode("errorNS:Error",
                                           nsManager);
    string errorNumber =
      Node.SelectSingleNode("errorNS:ErrorNumber",
                                    nsManager).InnerText;
    string errorMessage =
    Node.SelectSingleNode("errorNS:ErrorMessage",
                                nsManager).InnerText;
    string errorSource =
    Node.SelectSingleNode("errorNS:ErrorSource",
                                nsManager).InnerText;
    MessageBox.Show("Error Number is " + errorNumber);
    MessageBox.Show("Error Message is " + errorMessage);
    MessageBox.Show("Error Source is " + errorSource);

  }
  catch (Exception ex)
  {
    MessageBox.Show(ex.Message);
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...