长话短说,我正在向应用程序服务器发送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的形式返回响应主体,因为它可能不是错误,而是必须反序列化的对象。事情的这一方面,我无法改变。
非常感谢任何建议。 - Eli
编辑:只是想澄清我的基本代码在非错误情况下工作正常,并且正确地反序列化XML。当我的代码遇到HTTP 400或HTTP 500错误时,从catch语句访问XML会成为问题,因为我的代码会立即引发异常。答案 0 :(得分:2)
可以使用HttpWebResponse
对象的GetResponseStream
方法检索HTTP消息的正文(在您的情况下为XML)。而且,由于它是一个流,你可以用StreamReader
来读取它,如下所示:
HttpWebResponse myWebResponse; // Get this from whereever you want
Stream responseStream = myWebResponse.GetResponseStream();
StreamReader reader = new StreamReader(responseStream);
string niceStringForYou = reader.ReadToEnd();
......从那时起,你可以做任何事情。
如果您完全确定它将从服务中恢复,那么您甚至可以使用XmlReader
直接从流中获取XML:
XmlReader foo = XmlReader.Create(responseStream);
评论编辑:只要您拥有HttpWebResponse对象,读取它的响应流(GetResponseStream()
)就行了。正如您在自己的代码中指出的那样,您可以通过查看(HttpWebResponse)exceptionParameter.Response
来获取HttpWebResponse。