获取400或500 HTTP XML响应的XML主体

时间:2014-03-05 19:53:56

标签: c# xml http

长话短说,我正在向应用程序服务器发送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会成为问题,因为我的代码会立即引发异常。

1 个答案:

答案 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。