WCF XML反序列化对名称空间和别名非常挑剔

时间:2015-07-15 20:26:07

标签: xml wcf serialization soap xml-namespaces

我正在编写一个.net WCF SOAP服务,试图与Java客户端集成。这个过程有点不寻常,因为客户端已经指定了WSDL,我必须创建一个可以接受来自它们的请求的服务。

当我们尝试执行集成时,我得到了一些非常挑剔的结果。非常微妙的差异(对我来说似乎没问题)会导致XML反序列化失败。

这是客户端实际生成的XML,最终为CCHNameSearchResponse的所有子属性提供了空值,例如,在XML中设置为“999”的InterfaceControlField是空的)

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:soapclient.cch.doj.state.wi.us">
   <soapenv:Header/>
   <soapenv:Body>
      <impl:CCHNameSearchResponse xmlns:impl="urn:soapclient.cch.doj.state.wi.us" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
         <InterfaceControlField>999</InterfaceControlField>

这个有效,唯一的区别是命名空间别名(xmlns:impl =),这对我来说看起来像是可以接受的吗?

xmlns:urn="urn:soapclient.cch.doj.state.wi.us">
   <soapenv:Header/>
   <soapenv:Body>
      <CCHNameSearchResponse xmlns="urn:soapclient.cch.doj.state.wi.us" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
         <InterfaceControlField xmlns="">999</InterfaceControlField>

为什么?我怎样才能接受生成的XML?

2 个答案:

答案 0 :(得分:0)

问题在于,如果没有别名,命名空间将成为所有子元素的默认命名空间。

使用别名,子元素位于&#34; no-namespace&#34;中,因此在序列化中无法正确拾取。

这是每个规范,所以它为我生成XML的一方有问题。

http://www.w3.org/TR/xml-names/#defaulting

因此,不应使用任何别名(根据OP中的第二个示例)或别名必须在任何地方使用,如此处的示例

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:soapclient.cch.doj.state.wi.us">
   <soapenv:Header/>
   <soapenv:Body>
      <impl:CCHNameSearchResponse xmlns:impl="urn:soapclient.cch.doj.state.wi.us" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
         <impl:InterfaceControlField>999</impl:InterfaceControlField>

答案 1 :(得分:0)

我遇到了同样的问题,我通过向作为请求一部分的复杂类型添加和清空命名空间来解决它。

class PermissionsMixin(PermissionRequiredMixin):
    def handle_no_permission(self):
        self.raise_exception = self.request.user.is_authenticated()
        return super(PermissionsMixin, self).handle_no_permission()

然后将其正确反序列化:

PermissionRequiredMixin