WCF 服务将 XSI 命名空间应用于 SOAP 信封正文元素,而不是内容元素

本文关键字:元素 正文 XSI 服务 命名空间 应用于 SOAP WCF | 更新日期: 2023-09-27 18:34:36

我们有一个返回对象的测试 WCF Web 服务:

[ServiceContract]
[XmlSerializerFormat]
public interface IService1
{
    [OperationContract]
    MyObject GetData();
}
//Deserialize MyObject instance from a string
public MyObject GetData()
{
    string sXml = TestApp.Properties.Resources.Template;
    object o = null;
    using (TextReader rdr = new StringReader(sXml))
    {
        o = new XmlSerializer(typeof(MyObject)).Deserialize(rdr);
    }
    return (MyObject)o;
}

MyObject 实例的 xml 表示形式如下所示:

<MyObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    ...
    <notificationParty xsi:nil="true"></notificationParty>
    ...
</MyObject>

WCF 服务的实际响应如下所示:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
    <s:Header>
        ...
    </s:Header>
    <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <MyObject>
        ...
            <notificationParty xsi:nil="true"></notificationParty>
            ...
        </MyObject>
    </s:Body>
</s:Envelope>

我的问题是,为什么 .net 框架将 xml:xsi 命名空间从 MyObject 元素移动到 Body 信封?

WCF 服务将 XSI 命名空间应用于 SOAP 信封正文元素,而不是内容元素

.

NET 没有移动任何东西。

它将 xsi 命名空间放在根元素上,以便可以在所有子元素中使用。然后,因为它在根中,所以不需要将其添加到子级。

它可以将其移动到Envelope元素,甚至将其放在本文档中的每个元素上,它仍然意味着相同的内容。