我们有一个返回对象的测试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信封?
答案 0 :(得分:0)
.NET不是移动任何东西。
它将xsi
命名空间放在根元素上,以便它可以在所有子元素中使用。然后,因为它在根目录中,所以不需要将其添加到孩子身上。
它可以将它移动到Envelope
元素,或者甚至将它放在本文档中的每个元素上,它仍然意味着同样的事情。