WCF服务将XSI名称空间应用于soap信封主体元素而不是内容元素

时间:2014-12-18 00:52:26

标签: c# asp.net .net web-services wcf

我们有一个返回对象的测试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信封?

1 个答案:

答案 0 :(得分:0)

.NET不是移动任何东西。

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

它可以将它移动到Envelope元素,或者甚至将它放在本文档中的每个元素上,它仍然意味着同样的事情。