【问题标题】:WCF service applying XSI namespace to soap envelope body element not to the content elementWCF 服务将 XSI 命名空间应用于肥皂信封主体元素而不是内容元素
【发布时间】:2014-12-18 00:52:26
【问题描述】:

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

【问题讨论】:

  • 这个问题有什么解决办法吗?

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


【解决方案1】:

.NET 没有移动任何东西。

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

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

【讨论】:

  • 一些客户端试图拉出 MyObject xml 片段并对其进行处理,在这种情况下这将是无效的。我无法更改架构。有什么方法可以让这些客户更容易强制我的网络服务在两个地方都定义它?
  • 客户做错了。从 XML 的角度来看,这两种情况是相同的。如果他们期望在MyObject 上出现文字xsi,那么他们就错了,应该将其修复为使用 XML API 而不是使用字符串操作来处理数据。
猜你喜欢
  • 2013-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多