3

为了对处理 WCF 响应的类进行单元测试,我使用 Message.ToString() 捕获了一个实际的消息响应,这样我就不必实际进行 WCF 调用(从而使其成为集成测试而不是单元测试) . 如何根据来自 Message.ToString() 输出的 SOAP XML 重新构造 Message 对象,或者甚至有可能吗?我不知道哪个 Message.CreateMessage() 重载解决了这种情况。

这是 Message.ToString() 的结果:

    <s:信封 xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns: u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
      <s:标题>
        <a:Action s:mustUnderstand="1" u:Id="_4">http://schemas.xmlsoap.org/ws/2004/09/enumeration/EnumerateResponse</a:Action>
        <a:RelatesTo u:Id="_5">urn:uuid:3c4e24a9-af47-4f4a-879a-04a5e0296cd5</a:RelatesTo>
        <o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
          <u:时间戳 u:Id="uuid-73a747a6-ffda-43f2-908d-4e1d9ad52eed-1810">
            <u:Created>2013-06-05T17:11:39.734Z</u:Created>
            <u:Expires>2013-06-05T17:16:39.734Z</u:Expires>
          </u:时间戳>
          <c:DerivedKeyToken u:Id="_0" xmlns:c="http://schemas.xmlsoap.org/ws/2005/02/sc">
            <o:SecurityTokenReference>
              <o:参考 URI="urn:uuid:368c80e4-4044-4b00-8da4-8ba6c9f7c8d6" ValueType="http://schemas.xmlsoap.org/ws/2005/02/sc/sct" />
            </o:SecurityTokenReference>
            <c:Offset>0</c:Offset>
            <c:长度>24</c:长度>
            <c:Nonce>lnBkV4BtA6KOTkUGykrSyw==</c:Nonce>
          </c:DerivedKeyToken>
          <c:DerivedKeyToken u:Id="_1" xmlns:c="http://schemas.xmlsoap.org/ws/2005/02/sc">
            <o:SecurityTokenReference>
              <o:参考 URI="urn:uuid:368c80e4-4044-4b00-8da4-8ba6c9f7c8d6" ValueType="http://schemas.xmlsoap.org/ws/2005/02/sc/sct" />
            </o:SecurityTokenReference>
            <c:Nonce>oA/QSxlAEfZnE4Z3OgPX+w==</c:Nonce>
          </c:DerivedKeyToken>
          <e:ReferenceList xmlns:e="http://www.w3.org/2001/04/xmlenc#">
            <e:DataReference URI="#_3" />
            <e:DataReference URI="#_6" />
          </e:参考列表>
          <e:EncryptedData Id="_6" Type="http://www.w3.org/2001/04/xmlenc#Element" xmlns:e="http://www.w3.org/2001/04/xmlenc #">
            <e:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc" />
            <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
              <o:SecurityTokenReference>
                <o:参考 URI="#_1" />
              </o:SecurityTokenReference>
            </KeyInfo>
            <e:密码数据>
              <e:密码值>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</e:CipherValue>
            </e:密码数据>
          </e:加密数据>
        </o:安全>
      </s:标题>
      <s:身体 u:Id="_2">
        <EnumerateResponse xmlns="http://schemas.xmlsoap.org/ws/2004/09/enumeration" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http ://www.w3.org/2001/XMLSchema">
          <枚举上下文>
            <CurrentIndex xmlns="http://schemas.microsoft.com/2006/11/ResourceManagement">0</CurrentIndex>
            <EnumerationDirection xmlns="http://schemas.microsoft.com/2006/11/ResourceManagement">转发</EnumerationDirection>
            <Expires xmlns="http://schemas.microsoft.com/2006/11/ResourceManagement">9999-12-31T23:59:59.9999999</Expires>
            <Filter xmlns="http://schemas.microsoft.com/2006/11/ResourceManagement">/Person</Filter>
            <LocalePreferences xsi:nil="true" xmlns="http://schemas.microsoft.com/2006/11/ResourceManagement" />
            <选择 xmlns="http://schemas.microsoft.com/2006/11/ResourceManagement">
              <string>对象ID</string>
            </选择>
            <排序 xsi:nil="true" xmlns="http://schemas.microsoft.com/2006/11/ResourceManagement" />
          </枚举上下文>
          <EnumerationDetail xmlns="http://schemas.microsoft.com/2006/11/ResourceManagement">
            <Count>926</Count>
          </枚举详情>
          <过期>12/31/9999 23:59:59</过期>
        </EnumerateResponse>
      </s:正文>
    </s:信封>

那么,我如何从中构造一个 Message 呢?

4

2 回答 2

8

如果您拥有消息的整个信封,则可以Message使用重载创建对象Message.CreateMessage(XmlDictionaryReader, int, MessageVersion)XmlDictionaryReader使用与此类似的代码创建消息内容:

var bytes = Encoding.UTF8.GetBytes(theMessageString);
var reader = XmlDictionaryReader.CreateTextReader(bytes, XmlDictionaryReaderQuotas.Max);

现在,您拥有的消息有一些时间戳,已加密和签名。有可能一旦你将它传递给WCF,它就会无效......

于 2013-06-05T23:17:46.243 回答
0

您将在下面的链接中找到有关从 XML 创建 XSD,然后从 XSD 创建新类的说明。

从 XML 生成 C# 类

创建此对象的一个​​实例,并将其序列化以生成新的 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);
于 2013-06-05T21:51:00.297 回答