代码之家  ›  专栏  ›  技术社区  ›  blowdart

使用多个名称空间创建WCF消息

  •  0
  • blowdart  · 技术社区  · 17 年前

    我正在尝试创建一个WSTransfer实现(我意识到Roman Kiss已经为WCF编写了一个——但它实际上并不符合规范)

    我最终放弃了服务联系人上的数据契约,因为WSTransfer是松散耦合的;因此,创建消息的每个部分看起来都像消息创建(消息请求)。

    这很好,一切都很美好,直到它的时间来回击一个响应。

    我遇到的问题是WSTransfer响应的构造方式。以create为例,响应如下所示

    <wxf:ResourceCreated>
      <wsa:Address>....</wsa:Address>
      <wsa:ReferenceProperties>
        <xxx:MyID>....</xxx:MyId>
      </wsa:ReferenceProperties>
    </wxf:ResourceCreated>
    

    如您所见,响应消息中有3个不同的XML名称空间。

    现在,当一个人参与其中时,这是很容易的;您可以(即使没有公开),创建一个数据协定,设置值并将其发回

    Message response = Message.CreateMessage(request.Version, 
                "http://schemas.xmlsoap.org/ws/2004/09/transfer/CreateResponse",
                resourceCreatedMessage);
    

    但是,问题出现在为响应中的子元素设置不同的名称空间时;看来WCF的datacontracts并没有做到这一点。甚至使用

    [MessageBodyMember(Namespace="....")]
    

    那么,如何将不同的名称空间应用于WCF消息中的各个元素;要么通过合同,要么通过其他诡计?

    2 回复  |  直到 17 年前
        1
  •  0
  •   jezell    17 年前

    在这种情况下,当您需要精确控制XML输出时,应该使用XmlSerializer而不是DataContract或MessageContract序列化。以下是有关如何做到这一点的更多信息:

    http://msdn.microsoft.com/en-us/library/ms733901.aspx

        2
  •  0
  •   blowdart    17 年前

    所以跟进jezell的回答;手动创建消息时使用XmlSerialization的问题是根的子元素的元素名被弄乱了。发生这种情况的原因是,尽管手动创建消息时操作契约被标记为[XmlSerializerFormat],但仍使用DataContractSerializer。

    因此,答案似乎是为XmlSerializer编写一个包装类,它的基类是XmlObjectSerializer( here's an example )把它传进来;以及你的信息保持类。

    不幸的是,在XML中设置前缀不够聪明;所以你会收到这样的信息

    <ResourceCreated xmlns="http://schemas.xmlsoap.org/ws/2004/09/transfer" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Address xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing/">http://localhost:8731/Design_Time_Addresses/AddTests/WSTransfer/</Address>
      <ReferenceType xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing/"></ReferenceType>
    

    但这一切都是等价的。