Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用多个名称空间创建WCF消息_Wcf_Datacontract - Fatal编程技术网

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

使用多个名称空间创建WCF消息,wcf,datacontract,Wcf,Datacontract,我正在尝试创建一个WSTransfer实现,我意识到Roman Kiss已经为WCF编写了一个,但它实际上并不符合规范 我最终放弃了服务联系人上的数据契约,因为WSTransfer是松散耦合的;因此,create消息中的每个消息看起来都像messagecreatemessagerequest 这很好,一切都很美好,直到它的时间来回击一个响应 我遇到的问题是WSTransfer响应的构造方式。以create为例,响应如下所示 <wxf:ResourceCreated> <ws

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

我最终放弃了服务联系人上的数据契约,因为WSTransfer是松散耦合的;因此,create消息中的每个消息看起来都像messagecreatemessagerequest

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

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

<wxf:ResourceCreated>
  <wsa:Address>....</wsa:Address>
  <wsa:ReferenceProperties>
    <xxx:MyID>....</xxx:MyId>
  </wsa:ReferenceProperties>
</wxf:ResourceCreated>
但是,问题出现在为响应中的子元素设置不同的名称空间时;看来WCF的datacontracts并没有做到这一点。甚至使用

[MessageBodyMember(Namespace="....")]
在response类中的单个元素上,如果没有进行任何更改,则所有内容都将成为为contract类指定的命名空间的一部分


那么,如何将不同的名称空间应用于WCF消息中的各个元素;无论是通过契约,还是通过其他一些诡计?

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


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

无法将XmlSerializer传递到Message.CreateMessage,因为它需要XmlObjectSerializer,而XmlSerializer不是

因此,答案似乎是为XmlSerializer编写一个包装类,它将XmlObjectSerializer作为其基类并传入;以及你的信息保持类

不幸的是,在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>
但这一切都是等价的

<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>