如何获得正确的名称空间输出

本文关键字:空间 输出 何获得 | 更新日期: 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