Исключение «указанный тип не был распознан» при попытке вызова веб-службы - PullRequest
1 голос
/ 08 июня 2010

Я пытаюсь вызвать сторонний веб-сервис, используя WSE 3.0 в качестве клиента в Visual Studio 2005.

Вызов работает нормально, и я вижу, что получаю хороший ответ (у меня включена трассировка), но, видимо, анализатор xml его перекрывает. Я всегда получаю InvalidOperationException:

В документе XML есть ошибка.

с InnerException:

Указанный тип не был распознан: name = 'Map', пространство имен = 'http://xml.apache.org/xml-soap', at .

Это соответствующая часть ответа:

 <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns1="http://xml.apache.org/xml-soap" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns2="https://acceptatie.cartalk.nl/Soap/Apk" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <SOAP-ENV:Body>
      <SOAP-ENV:opvragenKeurmeesterGegevensResponse>
        <opvragenKeurmeesterGegevensReturn xsi:type="ns2:Backend_Apk_Result_OpvragenKeurmeesterGegevens">
          <naam xsi:type="xsd:string">A name</naam>
          ...
          <bevoegdheid SOAP-ENC:arrayType="ns1:Map[2]" xsi:type="SOAP-ENC:Array">
            <item xsi:type="ns1:Map">
              <item>
                <key xsi:type="xsd:string">soortBevoegdheid</key>
                <value xsi:type="xsd:string">AL</value>
              </item>
          ...
            </item>
            <item>
          ...
            </item>
          </bevoegdheid>
          <meldingSoort xsi:nil="true" />
          <meldingNummer xsi:nil="true" />
          <melding xsi:nil="true" />
        </opvragenKeurmeesterGegevensReturn>
      </SOAP-ENV:opvragenKeurmeesterGegevensResponse>
    </SOAP-ENV:Body>
  </SOAP-ENV:Envelope>

И вот как этот "bevoegdheid" определяется в wsdl:

  <xsd:element name="bevoegdheid" type="soap-enc:Array" /> 

В wsdl нет упоминания о типе "Карта".

Я гуглял по этому поводу, но единственный ответ, который я нашел, это что-то вроде

Сервис использует rpc / кодированный формат, с которым сложнее установить взаимодействие. Если вы можете изменить сервер на документ / литерал, лучше.

Но так как это сторонняя служба (которая уже используется другими клиентами), это не вариант для нас.

Есть еще предложения? Как я могу заставить анализатор xml распознавать этот тип "Map"?

Ответы [ 2 ]

3 голосов
/ 25 апреля 2012

Прежде всего, загрузите SOAPUI и проверьте wsdl, ваш запрос и ответ. Если что-то не так с их стороны, скажите им, чтобы они сами проверили свой веб-сервис и исправили его (кучка любителей!). Если веб-сервис не соответствует Базовому профилю WS-I, я бы даже сказал, не тратьте свое время впустую.


И если вы все еще не можете это исправить, следующее может указать вам правильное направление.

Я получил подобное исключение при десериализации ответов xml и soap, но так как вы не предоставили много подробностей, я не знаю вашей конкретной реализации. Так что это может быть полезно для вас, или не совсем: /.

Моя проблема была вызвана объектами в xml, которые являются унаследованными типами. Очевидно, XmlSerializer не справится с этим без каких-либо дополнительных инструкций.

Пример (C #):

Мой xml содержал объекты типа Function и некоторые типы, наследуемые от Function. Из-за этого обычный синтаксис для создания XMLSerializer не будет работать.

XmlSerializer Serializer = new XmlSerializer(typeof(MyCustomObject);

Очевидно, сериализатору нужны дополнительные инструкции, например:

XmlSerializer Serializer = new XmlSerializer(typeof(MyCustomObject), new Type[] {typeof(Function.InheritedType1), typeof(Function.InheritedType2), typeof(Function.InheritedType3), typeof(Function.InheritedType4) });

Где InheritedType - тип наследуемого объекта.

Надеюсь, это кому-нибудь поможет, удачи:).

0 голосов
/ 20 июля 2010

Здесь может быть несколько проблем. Один может быть следующий:

<bevoegdheid SOAP-ENC:arrayType="ns1:Map[2]" xsi:type="SOAP-ENC:Array">

в мыльном сообщении. Синтаксическому анализатору может не понравиться тот факт, что существует несоответствие регистра между определением атрибута типа WSDL для элемента «bevoegdheid» и значением xsi: type для элемента в сообщении мыла. Эта проблема может вызвать реальное (несколько вводящее в заблуждение) исключение, которое вы видите. Я не уверен, как исправить что-то подобное, так как вы не контролируете ни один из компонентов.

Сообщение об исключении говорит, что значение arrayType "ns1: Map [2]" не является допустимым именем элемента пространства имен ns1. Это пространство имен должно быть определено в XSD для "http://xml.apache.org/xml-soap", но, похоже, это не так. К сожалению, фундаментальная проблема может заключаться в том, что служба генерирует мыльные сообщения, которые, по-видимому, не соответствуют WSDL за услугу. Удачи!

...