gpt4 book ai didi

c# - 如何解析从文件加载的 soap 消息?

转载 作者:可可西里 更新时间:2023-11-01 03:11:17 24 4
gpt4 key购买 nike

我需要将从磁盘加载的 SOAP 消息解析为生成的代理类型。 WCF 在收到来自 http 服务器的消息时执行此操作,因此我应该能够从磁盘执行此操作。

我使用 WCF 使用 Web 服务,我从远程 WSDL 生成代理客户端。

这是我从网络接收到的 XML 结构(它是用 System.ServiceModel.MessageLogging 记录的),我想将其解析为生成的类 CRResponse。:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns1="urn:PourtuIntf" xmlns:ns2="ns2:PourtuIntf-IPourtu">
<SOAP-ENV:Header/>
<SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<ns2:GetCRResponse>
<return>
<ResultCode>0</ResultCode>
<CR>
<Theme SOAP-ENC:arrayType="ns1:ItemType[5]">
<item>
<Key/>
<Section SOAP-ENC:arrayType="ns1:Section[3]">
...

当我调用 Web 服务的“GetCR”操作时,消息被正确转换为 WCF 生成的代理客户端类型 GetCRResponse,但我不知道 WCF 是如何工作的,我需要从磁盘解析文件。

我试图以这种方式解析消息:

  GetCRResponse body;
using (var xmlReader = XmlReader.Create("Requests\\CR.xml"))
{
Message m = Message.CreateMessage(xmlReader, int.MaxValue, MessageVersion.Soap11);
body = m.GetBody<GetCRResponse>();
}

在 GeyBody 方法中引发了这个异常:

来自命名空间“http://schemas.datacontract.org/2004/07/Pourtu.PourtuClient”的预期元素“ActGetCRResponse”。正在检测名称为“ActGetCRResponse”、命名空间“urn:PourtuIntf-”的“元素” IPourtu'.

我尝试使用 SoapFormatter:

using ( FileStream fs = new FileStream("Requests\\CR.xml", FileMode.Open) )
{
SoapFormatter formatter = new SoapFormatter();
body = (ActGetCRResponse)formatter.Deserialize(fs);
}

..反序列化抛出以下异常:分析错误,没有与 xml 键“ns2 GetCRResponse”关联的程序集。

我无法使用 xml 序列化程序反序列化为 GetCRResponse,因为属性 SOAP-ENC:arrayType 需要由 soap 序列化程序解释。

最佳答案

SoapReflectionImporter 的帮助下,您应该能够使用 XmlSerializer 来完成此操作.

var importer = new SoapReflectionImporter("ns2:PourtuIntf-IPourtu");
var mapping = importer.ImportTypeMapping(typeof(GetCRResponse));
var serializer = new XmlSerializer(mapping);
var response = serializer.Deserialize(reader) as GetCRResponse;

The SoapReflectionImporter class provides type mappings to SOAP-encoded message parts, as defined in a Web Services Description Language (WSDL) document. It is used only when a Web service or client specifies SOAP encoding, as described in Section 5 of the SOAP 1.1 specification.

以下命令用于从 WSDL 生成您的客户端契约(Contract)

SvcUtil.exe IPlotiservice.wsdl /t:code /serviceContract

关于c# - 如何解析从文件加载的 soap 消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43682043/

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