问题是WCF不会在根目录创建这些全局命名空间,而是使用显式的未命名默认命名空间,这似乎让服务出现了问题。现在我知道这不是WCF的问题 - 我相信WCF生成的消息是有效的XML,但服务仍然无法处理它。
使用WCF生成的输出如下:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<h:Security xmlns:h="http://docs.oasis-open.org/wss/2004/01/oasis-
...
</h:Security>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<cancelShipmentRequest xmlns="http://www.royalmailgroup.com/api/ship/V2">
<integrationHeader>
<dateTime xmlns="http://www.royalmailgroup.com/integration/core/V1">2016-03-26T01:44:37.0493801Z</dateTime>
<version xmlns="http://www.royalmailgroup.com/integration/core/V1">2</version>
<identification xmlns="http://www.royalmailgroup.com/integration/core/V1">
<applicationId>RMG-API-G-01</applicationId>
<transactionId>ozhckwej6sxg</transactionId>
</identification>
</integrationHeader>
<cancelShipments>
<shipmentNumber>TTT001908905GB</shipmentNumber>
</cancelShipments>
</cancelShipmentRequest>
</s:Body>
</s:Envelope>
我可以帮助你进行翻译。以下是需要翻译的内容:
which doesn't work.
使用以下SOAP信封(在SoapUI中手动输入)可以正常工作:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:oas="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns:v2="http://www.royalmailgroup.com/api/ship/V2"
xmlns:v1="http://www.royalmailgroup.com/integration/core/V1">
<soapenv:Header>
<h:Security xmlns:h="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
...
</h:Security>
</soapenv:Header>
<soapenv:Body>
<v2:cancelShipmentRequest>
<v2:integrationHeader>
<v1:dateTime>2016-03-02T14:55:00Z</v1:dateTime>
<v1:version>2</v1:version>
<v1:identification>
<v1:applicationId>RMG-API-G-01</v1:applicationId>
<v1:transactionId>wftdaife96gv</v1:transactionId>
</v1:identification>
</v2:integrationHeader>
<v2:cancelShipments>
<v2:shipmentNumber>TTT001908905GB</v2:shipmentNumber>
</v2:cancelShipments>
</v2:cancelShipmentRequest>
</soapenv:Body>
</soapenv:Envelope>
两者之间的区别在于,v1和v2命名空间在文档顶部全局声明,第二个文档中没有本地命名空间声明。
也许我漏掉了什么,但对我来说,WCF生成的XML看起来是有效的,并且在命名空间方面代表相同的文档状态。
我唯一能发现的区别是命名空间声明的方式。虽然WCF版本似乎是有效的并产生相同的命名空间,但服务会抱怨无效的命名空间引用。
架构验证失败:消息架构验证失败:模式有效性错误:元素 'xmlns':不应出现此元素。期望的是({http://www.royalmailgroup.com/api/ship/V2}integrationHeader)。
问题是,如何最好地强制WCF在顶部添加命名空间引用而不是内联?到目前为止,我找到的唯一方法是使用消息检查器并显式重写消息,但如果我走这条路,我最好手动创建消息。
有什么想法可以尝试强制WCF使用显式命名空间前缀而不是手动重写消息吗?