Я работаю над взаимодействием с SOAP-службой, которая, как представляется, не имеет отношения к пространствам имен по умолчанию, но отлично работает с глобальными пространствами имен и префиксами пространства имен, объявленными на уровне оболочки SOAP.
Проблема заключается в том, что 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>
который не работает.
Использование следующего 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 объявляются глобально в верхней части документа, и во втором документе нет объявлений пространства имен.
Возможно, мне что-то не хватает, но для меня XML-код, созданный WCF, выглядит действительным и представляет одно и то же состояние документа в терминах пространства имен.
Единственное различие, которое я могу сказать, это то, как объявляются пространства имен. И хотя версия WCF, по-видимому, является действительной и создает одно и то же пространство имен, служба жалуется на недопустимые ссылки пространства имен.
Сбой проверки схемы: Ошибка проверки схемы: ошибка проверки схемы: элемент "xmlns": этот элемент не ожидается. Ожидается ({http://www.royalmailgroup.com/api/ship/V2} integrationHeader).
Вопрос в том, что лучший способ заставить WCF добавлять ссылки пространства имен наверху вместо встроенного? Единственный способ, который я нашел до сих пор, - это использовать инспектор сообщений и явно переписать это сообщение, но если я просмотрю все, что мог, просто вручную создаю сообщения.
Любые идеи, что я могу попытаться заставить WCF использовать явные префиксы пространства имен без ручной перезаписи сообщений?