如何从 SOAP 响应 XML 创建 WCF 消息对象 Posted 2023-02-19
技术标签:
【中文标题】如何从 SOAP 响应 XML 创建 WCF 消息对象 【英文标题】:How to create a WCF Message object from SOAP response XML
【发布时间】:2013-06-01 17:43:27
【问题描述】:
为了对处理 WCF 响应的类进行单元测试,我使用 Message.ToString() 捕获了一个实际的消息响应,这样我就不必实际进行 WCF 调用(从而使其成为集成测试而不是单元测试)。如何根据来自 Message.ToString() 输出的 SOAP XML 重新构造 Message 对象,或者甚至有可能吗?我不知道哪个 Message.CreateMessage() 重载解决了这种情况。
这是 Message.ToString() 的结果:
http://schemas.xmlsoap.org/ws/2004/09/enumeration/EnumerateResponseurn:uuid:3c4e24a9-af47-4f4a-879a-04a5e0296cd5 2013-06-05T17:11:39.734Z 2013-06-05T17:16:39.734Z 时间戳 >
0 24 长度>
lnBkV4BtA6KOTkUGykrSyw== oA/QSxlAEfZnE4Z3OgPX+w== 参考列表>
kLxDgVRs8jVM6 / e7BF5E4886rW9sN55 / 6d6GpLO9UiOQU48eDWZ1JDTwYBna + tddekUWIeNf47E8KqPg87NYauD / JxspZqhS6Ifnxr2GlP2xx05ttpQ1hDfLIsqU5YX1fxMD9aAVKlv3nA73NnpRO3HbEN8sXPJTf2hEyaj6qxh6mbST7j2CsBdv7qXXiq8y2s / QMOH + 7TnVDvgdT8FCFI62S2U6yqv67QnUjios e0QXuR3x4dXmmw435jAvukeJ + elk3845SSZUITSh6JOp3jjkqwarnWrqv4Nz30SU2IoczXhuq / Ln4TF / SFoqCEW7 + WR + gnYOAs99NvrsWsrVa2Fcc0 / qVzWNqXRDRQRiTnQEhnN7kKLO9Fodb8dG1 + DkVbEJJ + zSS0WuFwKQnSfiWGXBEFR9y3moLNfPnMzHxYwnxAbdumCgYA7 + iZGi87bIj / P1OzHv3NMR / lts8ugYOOKYRRHnImSTwBqzurQDYO + PDS5zBIDEBDXqt1AvazvtxnnpL7i / Shhze8gZMMcH2 + xUJ78Ivv8UphusINOHRg3gAxSG + 6zsxfflCnuku528oGMMcAHzeSFGKRgD + FkB0Rbii9jGzYPtv8C8Kv + t4DKgmfq5OfMowgqqcVBkcLz4aafKrcshtB0 + vJdeJEbv6lORDABgxVbM73Q5vUbSflcwzuTbAxFrviYpwUJYKvrM08pttAB / MP4 / UWGqg6E8EwbkGPQv4RAObWZiUpDMilfed02imEoW / WWoeymYM1bSxRUwCl1ZoBHMnuEvfpyBIW2CPJLBHfnvABsPZ + p2qnK / z62kvPd6JPw0fx / Cput6JzxIV7iXjkv + kh32lgwr7JGkVntRK4o6EKnMKd / eMwU0d5tfymh9ceil4If + ntUeEcDwFdjzFrwxVTghGJAVe4tUeqtalVBnq4zGna / PPBroL / QX4 + kRxOBB1hlzrj3fBXmIIGewHv8zNDUE / RzPGPDmm GX + R27fFHG0Wfj8FbgkrSBTLNydjhInaVZFTa / ayAHbzBi9mgtFCIIrc7jFROK1yWFLaGkSmCYVP7boW6zvQPWtiSvDpw / ++ BqR4NoJB5IXFTbDpyyryj3eNn1x0fLH / ovsy3IYBdbYiPqzI8HJB3zi6trRw1JYvmYQOcvZPE72xEiGddxgCvq + PsrAhHSrmMfrpdQdL3qM / bnYZLVJHvU0XWFWDgqoN / I37vvgNPOPyRFYq / 4Zg3y07jagMF3DrRT39iANKBzPWOI8uWbwtvvH / M18dDpj8GBMk59fJ9BO0JNGsNr3q0tFnMNFeKnePb + Hf33e0BrC67S1IthnAfZGypVFM1VLgn60lO9NyeYZwcC50k / 0B6ZDUZWBrhBFIBozIJbQ6ou9 + dh3JNPkAgSfRNLHbHUB3JDxG31RI0gwKe2h2ZHBdFpk57KZJCzioz3b60I4h78XLJXV4gj8O1zunERI6r1qdhmG4JZ5UTKCRLQn2AFCZy6ATP2QKgPaLpmZmFAYYPUwoa0gPRY2aqBRpP3XeidSAVuS15R1N67pSMS9 + gkzc8YqVKYLzQYm1qHPi7al8tW6X1RFZk3VMtVlvxOWy8qv2WU / rmOdX8BM***YNaW2jnkPYy2WMe8XYcl12o50FDCF1KRVUC + i6IWNe2BOcNIMO4CIcZvQ7EhKtzmUDE3iPYy + mONyH + d417Ag + / + C45RJUZ WkfPnvxTZRFlBcavYax2hgPlRHOjM6E4NuxQPgiwElyI8kAPG / V1OKCss9KE4RN9B + MQhTGbv0t6SSpDb5eJIM6DbPcXZDUFnVGO03zKY3gEr6MWS0TUSy3 / uTHsAUgqGwrKIUmtbgUmLBBJjMA + 5kF2zAfykkISuswGAuUsbiQXSmDnul1VkbrXxyYXV5aRjWrArHAmsVE2EmfBhP5V9Y65czRuFUEsQZQRBXgy50eDJ2dB9Rp27xON8VBNYAwlMvMIbbcKA2a49QzNvXKTfpnmhd5 uPPZkSwKtZWx29UH6eJbzpztKTrLjEgbPtl1w8XyHDuWQwXNeRKCc2VB96I595E
密码数据>
加密数据>
安全>
标题>
0 转发 9999-12-31T23:59:59.9999999 /Person 对象ID 选择>
枚举上下文>
926 枚举详情>
12/31/9999 23:59:59过期>
正文>
信封>
那么,我该如何构造一个 Message 呢?
【问题讨论】:
你试过这个吗:***.com/questions/6131111/…
另一种方法是使用 xsd 工具构建一个捕获数据的类,然后反序列化,但这很混乱。您没有访问 WSDL 的权限吗?因为那会更简单。
【参考方案1】:
如果您有一个邮件的整个信封,您可以使用重载Message.CreateMessage(XmlDictionaryReader, int, MessageVersion)
创建Message
对象。使用与此类似的代码在消息内容上创建XmlDictionaryReader
:
var bytes = Encoding.UTF8.GetBytes(theMessageString);
var reader = XmlDictionaryReader.CreateTextReader(bytes, XmlDictionaryReaderQuotas.Max);
现在,您拥有的消息有一些时间戳,已加密和签名。有可能一旦传给WCF就失效了……
【讨论】:
谢谢,卡洛斯 - 完成了这项工作。是的,有时间戳、签名等,但我真正需要测试的是身体的处理,你的示例代码让我很好。我没有将它传递给 WCF,只是单元测试。 【参考方案2】:
您将在下面的链接中找到有关从 XML 创建 XSD,然后从 XSD 创建新类的说明。
Generate C# class from XML
创建该对象的一个实例,并将其序列化以生成新的 XML:
public class SoapThing
...
SoapThing p=new SoapThing ();
p.x = some values;
System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(p.GetType());
x.Serialize(Console.Out, p);
【讨论】:
以上是关于如何从 SOAP 响应 XML 创建 WCF 消息对象的主要内容,如果未能解决你的问题,请参考以下文章
强制 Soap/WCF 使用 HTTP 而不是 TCP 协议
如何从 WCF 服务返回 xml 响应
如何使用 DataContractSerializer 从文件中反序列化 WCF 肥皂响应消息?
WCF 如何根据请求决定何时返回 SOAP 或 JSON?
web service && WCF 学习总结
WCF 服务而不是 ASMX Web 服务?