【问题标题】:Get XML body of a 400 or 500 HTTP XML response获取 400 或 500 HTTP XML 响应的 XML 正文
【发布时间】:2014-03-05 19:53:55
【问题描述】:

长话短说,我正在向应用服务器发送一个 XML HTTP 发布请求,并且我收到了一个响应,也是 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 就会成为问题,因为我的代码会立即抛出异常。

【问题讨论】:

    标签: c# xml http


    【解决方案1】:

    可以使用您拥有的 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();
    

    ...从那时起,你可以为它做任何事情。

    如果您绝对确定从服务返回的始终是 XML,您甚至可以使用 XmlReader 直接从流中获取 XML:

    XmlReader foo = XmlReader.Create(responseStream);
    

    编辑评论:只要你有 HttpWebResponse 对象,读取它的响应流 (GetResponseStream()) 应该可以工作。正如您在自己的代码中指出的那样,您可以通过查看 (HttpWebResponse)exceptionParameter.Response 来获取 HttpWebResponse。

    【讨论】:

    • 工作就像一个魅力!谢谢,Arve - 像你这样的人制作 S.O.这么棒的网站。
    • 只是为了完成这件事:遗憾的是,我还不能让 XmlReader 工作,但描述的第一个方法工作得很好。不确定此时响应中会返回什么,因为当我有以下内容时: XmlReader foo = XmlReader.Create(responseStream);字符串内容 = foo.GetAttribute("Message");内容保持为空 =*(。也许有一天我会解开这个谜团......
    猜你喜欢
    • 2022-01-20
    • 1970-01-01
    • 2022-10-19
    • 2016-06-20
    • 2018-08-15
    • 2021-04-06
    • 1970-01-01
    • 2011-04-25
    • 2011-04-12
    相关资源
    最近更新 更多