c# - 获取 400 或 500 HTTP XML 响应的 XML 正文

标签 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 的形式取回响应主体,因为它可能不是错误,而是必须反序列化的对象。事物的这一特殊方面,我无法改变。

如有任何建议,我们将不胜感激。 - 以利

编辑:只是想澄清一下,我的基本代码在非错误情况下工作正常,并且反序列化 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/

相关文章:

java - android 无法设置按钮的宽度?

c# - MySQL插入 double 值时出现问题

c# - 使用动态创建的控件跟踪值

xml - XSLT:一旦找到我也想要的东西,就摆脱 for-each

用于监控网络请求和响应的 Node.js 代理

http - Nginx 慢速静态文件服务(比节点慢?)

json - 在 render.Bind 中置空 http.Request.Body

c# - 向用户报告异常消息时的最佳实践

c# - WIQL 树查询从单个子 ID 获取所有父工作项?

java - 根据 java 中其他元素的内容跳过特定元素的 XSD 验证