如何获得正确的名称空间输出
本文关键字:空间 输出 何获得 | 更新日期: 2023-09-27 18:15:22
我有一个实现IXmlSerializable的类。当我使用自定义XmlWriter/XmlReader时,它可以正常工作并输出正确的输出。然而,当我在WCF中使用它时,我得到一个非常干净的输出,它有点太干净了,因为它不包含任何类型信息:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<GetModelCResponse xmlns="http://tempuri.org/">
<GetModelCResult>
<D xmlns="">D</D>
<E xmlns="">
<B>B</B>
<A>A</A>
</E>
</GetModelCResult>
</GetModelCResponse>
</s:Body>
</s:Envelope>
然而,我希望这样的东西(当使用XmlWriter时,确实写):
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<GetModelCResponse xmlns="http://tempuri.org/">
<GetModelCResult xmlns:a="http://schemas.datacontract.org/2004/07/Model" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<a:D>D</a:D>
<a:E i:type="a:ModelA">
<a:A>A</a:A>
<a:B>B</a:B>
</a:E>
</GetModelCResult>
</GetModelCResponse>
</s:Body>
</s:Envelope>
我做错了什么?是配置问题吗?
您可以更改wcf使用的序列化器。
实现这一点的一种方法是使用[XmlSerializerFormat]
属性放在服务实现的顶部。
如果您需要更多的附加功能,您可以考虑使用自定义序列化器。
Dan Rigsby不久前在他的博客上写了一篇关于这个话题的文章。在文章的末尾,他讨论了创建IOperationBehavior到
的实现。这个想法很简单,创建一个操作行为,用自定义的序列化器替换普通的序列化器。只要这个类继承自Attribute,就可以用它来修饰实现。
我们之前有过类似的事情,我在过去的笔记中注意到:http://www.pluralsight-training.net/community/blogs/kirillg/archive/2006/06/18/28380.aspx