Во-первых, взгляните на другой мой вопрос ( часть 1 ).В нем рассказывается о том, как я хочу вызывать веб-службы на маршрутизаторе Cisco (агент управления веб-службами - WSMA) из .NET 4 с использованием WCF.
Я применил метод Ладислава и продвинулся очень далеко.Однако сейчас я нахожусь на этапе, когда я довольно уверен, что отправляю правильно сформированные запросы SOAP, но маршрутизатор его не принимает.
В документации Cisco Есть несколько примеров допустимых SOAP-запросов, таких как этот:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SOAP:Body>
<request xmlns="urn:cisco:wsma-config" correlator="4.1">
<configApply details="all">
<config-data>
<cli-config-data>
<cmd>no cns config partial mixy</cmd>
<cmd>no stupid</cmd>
<cmd>no cns exec 80 </cmd>
</cli-config-data>
</config-data>
</configApply>
</request>
</SOAP:Body>
</SOAP:Envelope>]]>]]>
Используя трассировку WCF, я проверяю, что отправляемый запрос выглядит следующим образом:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<request correlator="1" xmlns="urn:cisco:wsma-config">
<configApply action-on-fail="rollback" details="all">
<config-data>
<cli-config-data>
<cmd xsi:type="xsd:string">hostname Gunnar</cmd>
</cli-config-data>
</config-data>
</configApply>
</request>
</s:Body>
</s:Envelope>
Для меня это выглядит чертовски верно.Да, пространства имен xsd и xsi объявлены в теле мыла, а не в конверте, но это не должно иметь значения.Атрибут action-on-fail является необязательным и присутствует в других примерах.Тип xs: тоже должен быть в порядке.В противном случае это полностью эквивалентно.Или?
Тем не менее, я всегда получаю ответ:
<SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xml="http://www.w3.org/XML/1998/namespace">
<s:Header xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"></s:Header>
<SOAP:Body>
<SOAP:Fault>
<faultcode xmlns="">SOAP:Client</faultcode>
<faultstring xmlns="">An expected XML tag or sequence is missing</faultstring>
<detail xmlns="">
<WSMA-ERR:error xmlns:WSMA-ERR="urn:cisco:wsma-errors">
<WSMA-ERR:tag>xml</WSMA-ERR:tag>
<WSMA-ERR:details>XML_ERROR_MISSING_ELEMENT</WSMA-ERR:details>
</WSMA-ERR:error>
</detail>
</SOAP:Fault>
</SOAP:Body>
</SOAP:Envelope>
Я не вижу, что какой-либо элемент отсутствует.
Вы не предполагаете, что IOS требуетпрефикс пространства имен, чтобы быть SOAP (а не s)?Это было бы совершенно глупо, но у меня заканчиваются варианты (кто знает, может быть, они не десериализуют XML, а анализируют его текстово).Кто-нибудь знает, как я могу указать префикс пространства имен, который WCF будет использовать для конверта SOAP?