在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协议的影响。
答案 0 :(得分:3)
您不清楚自己曾尝试使用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
,但它可能是一个好主意。你可能也想处理响应流,虽然我认为处理响应已经足够了。)
答案 1 :(得分:0)
我认为你可以抓住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);
}