如何从 SOAP 响应 XML 创建 WCF 消息对象

Posted

技术标签:

【中文标题】如何从 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-04a5e0296cd52013-06-05T17:11:39.734Z2013-06-05T17:16:39.734Z时间戳> 024长度> lnBkV4BtA6KOTkUGykrSyw==oA/QSxlAEfZnE4Z3OgPX+w==参考列表> kLxDgVRs8jVM6 / e7BF5E4886rW9sN55 / 6d6GpLO9UiOQU48eDWZ1JDTwYBna + tddekUWIeNf47E8KqPg87NYauD / JxspZqhS6Ifnxr2GlP2xx05ttpQ1hDfLIsqU5YX1fxMD9aAVKlv3nA73NnpRO3HbEN8sXPJTf2hEyaj6qxh6mbST7j2CsBdv7qXXiq8y2s / QMOH + 7TnVDvgdT8FCFI62S2U6yqv67QnUjiose0QXuR3x4dXmmw435jAvukeJ + 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 服务?