gpt4 book ai didi

c# - 在 C# 中,我应该如何反序列化完整的 SOAP XML 响应

转载 作者:行者123 更新时间:2023-12-04 16:56:49 25 4
gpt4 key购买 nike

我们需要调用一个 SOAP 服务。
不幸的是,WSDL 生成的代码没有按预期工作,因为它们需要 MTOM,causes problems we have not been able to resolve .所以我们被迫重新发明轮子,我正在努力找出最好的(或至少是一个好方法)来做到这一点。
SOAP 服务将创建如下响应:

--uuid:d49971de-e2c2-4af4-947d-c0acc0f6ad64
Content-Type: application/xop+xml; charset=UTF-8; type="application/soap+xml"
Content-Transfer-Encoding: binary
Content-ID:

<root.message@cxf.apache.org>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
<soap:Body>
<ns2:listAttachmentsResponse xmlns:ns2="http://ws.praxedo.com/v6/businessEvent">
<return>
<resultCode>0</resultCode>
<entities>
<entityId>00044</entityId>
<name>JohnDoe.pdf</name>
<addedOnDevice>false</addedOnDevice>
<creationDate>2021-03-17T20:48:36.849+01:00</creationDate>
<external>false</external>
<id>1103057659_1500033662_C_05126a814b440b8c6efea0d195cbae8f</id>
<lastModificationDate>2021-05-04T20:38:42.829+02:00</lastModificationDate>
<size>249794</size>
<unmodifiable>false</unmodifiable>
</entities>
<entities>
<entityId>00044</entityId>
<name>OAY3PD.pdf</name>
<addedOnDevice>false</addedOnDevice>
<creationDate>2021-03-17T20:48:36.829+01:00</creationDate>
<external>false</external>
<id>1103057659_1500033662_C_04870c813b0c352bed5213425a946d5c</id>
<lastModificationDate>2021-05-04T20:38:42.829+02:00</lastModificationDate>
<size>465275</size>
<unmodifiable>false</unmodifiable>
</entities>
</return>
</ns2:listAttachmentsResponse>
</soap:Body>
</soap:Envelope>
--uuid:d49971de-e2c2-4af4-947d-c0acc0f6ad64--
  • 是否有一种方便或惯用的方法可以从这个响应中提取我们关心的 Xml,或者我们是否需要创建自定义逻辑来处理边界和内容元数据?
  • 我如何处理不同的命名空间和别名,以及它们的缺失,以及名为“return”的元素?

  • 我希望结果是一个 POCO,可能是这样的:
    public class ListAttachmentsResponse {
    public int ResultCode { get; init; }
    public Attachment[] Attachments
    }

    public class Attachment {
    // This is the "entityId", we need to keep the leading zeros.
    public string BusinessEventId { get; init; }

    public string FileName { get; init; }
    public bool IsAddedOnDevice { get; init; }
    public DateTime CreationDate { get; init; }
    public bool IsExternal { get; init; }
    public string Id { get; init; }
    public DateTime LastModificationDate { get; init; }
    public int size { get; init; }
    public bool IsUnmodifiable { get; init ;}
    }
    ...但如果其他东西更容易检索,我可以灵活处理结构。

    最佳答案

    在使用 Visual Studio 的“选择性粘贴 -> 将 Xml 粘贴为类”和一些示例数据后,我能够使用以下方法:

            private const string EnvelopeClose = "</soap:Envelope>";

    private static listAttachmentsResponse Parse(string responseContent)
    {
    string data = responseContent[responseContent.IndexOf("<soap:Envelope")..];
    int envelopeCloseIndex = data.IndexOf(EnvelopeClose);
    data = data.Substring(0, envelopeCloseIndex) + EnvelopeClose;

    XmlSerializer serializer = new(typeof(ResponseEnvelope));
    ResponseEnvelope result;
    using (StringReader reader = new(data))
    {
    result = (ResponseEnvelope)serializer.Deserialize(reader);
    }
    return result.Body.listAttachmentsResponse;
    }
    我认为这很丑陋,所以我愿意接受更好的方法来做这件事的建议!

    关于c# - 在 C# 中,我应该如何反序列化完整的 SOAP XML 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69270797/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com