Работа с Cisco WSMA из .NET (часть вторая) - PullRequest
0 голосов
/ 09 сентября 2010

Во-первых, взгляните на другой мой вопрос ( часть 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?

1 Ответ

0 голосов
/ 10 сентября 2010

Да.

Используя трассировку WCF, fiddler и отладку на маршрутизаторе, а также вручную отправляя сообщения по HTTP, я наконец выяснил, что происходит.маршрутизатор ожидает, что полезная нагрузка сообщения SOAP в запросе HTTP будет включать объявление XML.И WCF не отправляет один.

Я отправил новый вопрос о том, как заставить клиента WCF отправлять декларацию XML со своими запросами SOAP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...