WCF SOAP Body中的命名空间前缀(带有Liquid XML数据绑定)

时间:2016-04-18 20:17:25

标签: c# xml wcf

我们将Liquid Data Binding库用于WSDL和XSD中使用的大量对象,用于我们与WCF一起使用的SOAP服务(用于接收和发起服务)。一切都通常没有任何问题。我们通过在线测试套件测试我们的服务(传入和传出),以获得我们与客户继续使用我们的端点所需的认证。

我们几乎通过了所有测试,除了一个。从技术上讲,它没有XML的任何错误或问题。相反,它没有遵循最佳实践。

说明我们的问题。我将展示我们现在的输出。其次是所需的输出。差异很微妙,但对我们很重要(将在最后描述)。

当前输出:

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
    <s:Header>
        (truncated)
    </s:Header>
    <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <AdhocQueryRequest xmlns="urn:oasis:names:tc:ebxml-regrep:xsd:query:3.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:mif="urn:hl7-org:v3/mif" xmlns:rim="urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0" xmlns:rs="urn:oasis:names:tc:ebxml-regrep:xsd:rs:3.0" xmlns:query="urn:oasis:names:tc:ebxml-regrep:xsd:query:3.0" xmlns:hl7="urn:hl7-org:v3" xmlns:xdsb="urn:ihe:iti:xds-b:2007" federated="false" startIndex="0" maxResults="-1">
            <query:ResponseOption returnType="LeafClass" returnComposedObjects="true"/>
            <rim:AdhocQuery id="urn:uuid:14d4debf-8f97-4251-9a74-a90016b0af0d" status="('urn:oasis:names:tc:ebxml-regrep:StatusType:Approved,urn:oasis:names:tc:ebxml-regrep:StatusType:Deprecated')">
                <rim:Slot name="$XDSDocumentEntryPatientId">
                    <rim:ValueList>
                        <rim:Value>
'RI0004.000000002^^^&2.16.840.1.113883.3.1259.10.1003&ISO'
                        </rim:Value>
                    </rim:ValueList>
                </rim:Slot>
                <rim:Slot name="$XDSDocumentEntryStatus">
                    <rim:ValueList>
                        <rim:Value>
('urn:oasis:names:tc:ebxml-regrep:StatusType:Approved,urn:oasis:names:tc:ebxml-regrep:StatusType:Deprecated')
                        </rim:Value>
                    </rim:ValueList>
                </rim:Slot>
            </rim:AdhocQuery>
        </AdhocQueryRequest>
    </s:Body>
</s:Envelope>

所需的输出是:

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
    <s:Header>
        (truncated)
    </s:Header>
    <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <query:AdhocQueryRequest xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:mif="urn:hl7-org:v3/mif" xmlns:rim="urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0" xmlns:rs="urn:oasis:names:tc:ebxml-regrep:xsd:rs:3.0" xmlns:query="urn:oasis:names:tc:ebxml-regrep:xsd:query:3.0" xmlns:hl7="urn:hl7-org:v3" xmlns:xdsb="urn:ihe:iti:xds-b:2007" federated="false" startIndex="0" maxResults="-1">
            <query:ResponseOption returnType="LeafClass" returnComposedObjects="true"/>
            <rim:AdhocQuery id="urn:uuid:14d4debf-8f97-4251-9a74-a90016b0af0d" status="('urn:oasis:names:tc:ebxml-regrep:StatusType:Approved,urn:oasis:names:tc:ebxml-regrep:StatusType:Deprecated')">
                <rim:Slot name="$XDSDocumentEntryPatientId">
                    <rim:ValueList>
                        <rim:Value>
'RI0004.000000002^^^&2.16.840.1.113883.3.1259.10.1003&ISO'
                        </rim:Value>
                    </rim:ValueList>
                </rim:Slot>
                <rim:Slot name="$XDSDocumentEntryStatus">
                    <rim:ValueList>
                        <rim:Value>
('urn:oasis:names:tc:ebxml-regrep:StatusType:Approved,urn:oasis:names:tc:ebxml-regrep:StatusType:Deprecated')
                        </rim:Value>
                    </rim:ValueList>
                </rim:Slot>
            </rim:AdhocQuery>
        </query:AdhocQueryRequest>
    </s:Body>
</s:Envelope>

不同之处在于SOAP Envelope Body下的第一个子节点AdhocQueryRequest节点。如果第一个例子(我们当前的输出)&#34; urn:oasis:names:tc:ebxml-regrep:xsd:query:3.0&#34;重复两次,一次作为默认值(所以节点,我猜不需要一个前缀)和另一个定义为&#34;查询&#34;前缀(用于其他子节点)。标准委员会审查我们的要求和认证回复,发现您首先形成了非最佳实践&#34; (即使它在技术上有效)。

现在我们已经想出了一种在输出中获取正确名称空间前缀的方法,该方法适用于子节点。但是,我们无法弄清楚如何摆脱节点的默认命名空间并提供&#34;查询&#34; AdHocQueryRequest节点中的前缀。是&#34;查询&#34;命名空间需要在上面定义吗?有什么我想念的东西会让我像第二个例子那样输出吗?

由于

0 个答案:

没有答案