我正在编写一个.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?
答案 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