长话短说,我正在向应用程序服务器发送一个 XML HTTP post 请求,我得到一个响应,也是以 XML HTTP 的形式。
我有一个可用的测试站点,它允许我以 XML 的形式直观地查看服务器的实际响应是什么,但我无法按原样从我的 C# 代码访问此 XML。
在我的测试用例中,从应用服务器返回的 XML 如下所示:
<Error><Message>StringErrorMessage</Message></Error>
但是,我没有运气访问这个基本的 XML 来检索“StringErrorMessage”的值以创建详细的错误报告。
... More code above, all wrapped in a try{}...
_response = Serializer.DeserializeObject<T>(ObjectRequest.GetResponse().GetResponseStream());
}
catch (System.Net.WebException exceptionParameter)
{
var response = (HttpWebResponse)exceptionParameter.Response;
string webExceptionStatus = exceptionParameter.Message;
_exception = exceptionParameter;
return false;
}
我咨询过 C# - Getting the response body from a 403 error
和
Get response body on 400 HTTP response in Android?
第一个链接的解决方案似乎没有让我访问作为任何响应对象属性一部分的基本 XML。我几乎肯定那里的某个地方(在响应中,或在异常对象中)必须有一个 byte[] 可以转换成一个 char[],它可以转换成一个字符串,它可以转换成我的XML 正文,但我没能找到它。第二个链接的解决方案对我来说并不完全可行,因为我必须以 XML 的形式取回响应主体,因为它可能不是错误,而是必须反序列化的对象。事物的这一特殊方面,我无法改变。
如有任何建议,我们将不胜感激。 - 以利
编辑:只是想澄清一下,我的基本代码在非错误情况下工作正常,并且反序列化 XML 也很好。当我的代码遇到 HTTP 400 或 HTTP 500 错误时,从 catch 语句访问 XML 就会出现问题,因为我的代码会立即引发异常。
最佳答案
可以使用 GetResponseStream
检索 HTTP 消息的正文(在您的例子中是 XML) HttpWebResponse
对象的方法。而且,由于它是一个流,您可以使用 StreamReader
读取它,如下所示:
HttpWebResponse myWebResponse; // Get this from whereever you want
Stream responseStream = myWebResponse.GetResponseStream();
StreamReader reader = new StreamReader(responseStream);
string niceStringForYou = reader.ReadToEnd();
...从那时起,您可以对它做任何事情。
如果您绝对确定从服务返回的始终是 XML,您甚至可以使用 XmlReader
直接从流中获取 XML:
XmlReader foo = XmlReader.Create(responseStream);
要编辑的评论:只要您拥有 HttpWebResponse 对象,读取它的响应流 (GetResponseStream()
) 就应该可以工作。正如您在自己的代码中指出的那样,您可以通过查看 (HttpWebResponse)exceptionParameter.Response
来获取 HttpWebResponse。
关于c# - 获取 400 或 500 HTTP XML 响应的 XML 正文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22207844/