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