Code First .NET Web Service использует мыльное кодирование - как это можно предотвратить? - PullRequest
1 голос
/ 25 августа 2009

Как можно настроить asp.net / asmx, чтобы вообще не использовать мыльную кодировку при генерации wsdls из интерфейса .NET? Короче говоря, веб-служба .NET SOAP создает wsdl, который включает кодировку мыла. Например:

<s:schema targetNamespace="http://tempuri.org/AbstractTypes">
  <s:import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
  <s:complexType name="StringArray">
    <s:complexContent mixed="false">
      <s:restriction base="soapenc:Array">
        <s:sequence>
          <s:element minOccurs="0" maxOccurs="unbounded" name="String" type="s:string" />
        </s:sequence>
      </s:restriction>
    </s:complexContent>
  </s:complexType>
</s:schema>

Не удается выполнить синтаксический анализ с wsdl2java в CXF, реализации JAX-WS, из-за бита soapenc: Array. Исправление состоит в том, чтобы изменить вышеупомянутый xml на:

<s:schema targetNamespace="http://tempuri.org/AbstractTypes">
  <s:import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
  <s:complexType name="StringArray">
        <s:sequence>
          <s:element minOccurs="0" maxOccurs="unbounded" name="String" type="s:string" />
        </s:sequence>
  </s:complexType>
</s:schema>

1 Ответ

2 голосов
/ 28 августа 2009

Это проблема 6 из одного, 12/2 для другого - wsdl2java не поддерживает должным образом сложные типы, как, по мнению реализации Microsoft WSDL.

Обсуждение того, является ли это ошибкой Java или MS, бессмысленно.

К сожалению, существует очень мало реализаций SOAP, которые обрабатывают что-либо, кроме примитивных типов, поэтому веб-службы Microsoft отлично подходят для взаимодействия на поверхности, но на самом деле они работают только с прокси-серверами Microsoft.

Для вашего обходного пути у вас есть несколько вариантов:

  1. Придерживайтесь примитивных типов .Net - в основном типы значений + строка. Нет массивов, списков или чего-либо со сложной сериализацией.

  2. Напишите свой собственный HttpHandler для возврата Xml в формате, который может обрабатывать Java - я фактически сделал что-то подобное при работе с Flex / ActionScript (с той же проблемой).

  3. Переходите на другой формат - ИМХО большая часть Интернета переходит от SOAP к сервисам в стиле REST.

Из них (1) самый простой, но и самый неуклюжий. В результате вы получаете хаки, подобные описанному WDSL методу SOAP, который возвращает строку, но эта строка на самом деле является кодированным XML, который может анализировать потребляющая Java. Юк.

Вы всегда получаете такие забавные вещи при работе на разных платформах: - (

...