Как я могу использовать службу SOAP на основе Java, которая использует тип Datahandler в C#

#c# #soap #datahandler

#c# #soap #datahandler

Вопрос:

Я пытаюсь использовать службу SOAP (веб-сервис Agile PLM) с использованием C #, но служба SOAP использует тип «Datahandler», который, по-видимому, зависит от языка Java (насколько я могу судить, с использованием библиотеки Apache Axis).

Когда я пытаюсь использовать wsdl.exe инструмент для создания прокси-класса завершается с ошибкой из-за отсутствия типа для этого datahandler. Кто-нибудь может предложить, как (чисто, эффективно) использовать эту службу SOAP без необходимости вручную кодировать прокси-класс или вручную обрабатывать сообщения SOAP в C #?

Ответ №1:

Вы можете использовать классы, состоящие только из сериализуемых базовых типов, через веб-сервисы… В противном случае клиент никак не мог бы узнать, что означают такого рода данные. Я думаю, что ваш datahandler состоит не только из необработанных структур данных…

Вы могли бы обернуть данные в вашем datahandler в исправный класс «view», например:

 class datahandlerView
{
    string a;
    string b;
    List<MyOtherView> list;
}
  

Обычно вы можете просто отправить это через SOAP и JaxWS, если списки и типы являются более или менее базовыми типами Java. Они должны быть сериализуемы в XML.
Не предоставляйте объекты (например, из JPA или Hibernate) непосредственно в вашей конечной точке WS — по крайней мере, если вам нужно — убедитесь, что все ассоциации объектов помечены как нетерпеливые (иначе вызов WS завершится неудачно во время выполнения).
Надеюсь, это поможет.

Комментарии:

1. Кстати, какие версии серверного программного обеспечения вы используете? В частности, какие версии Apache и JaxWS вы используете?

2. Да, это точная проблема — я не знаю, что находится в этом типе данных, и я не могу изменить службу, которая его предоставляет. Это SOAP-сервис «из коробки» от Agile PLM. Может быть, если бы я мог вызвать службу SOAP, я мог бы посмотреть, что она отправляет обратно с помощью Wireshark или чего-то еще…

Ответ №2:

Прежде всего, если вы не застряли в .NET 2.0, вам не следует использовать WSDL.EXE . Вы должны использовать SVCUTIL.EXE или «Добавить ссылку на службу».

В любом случае, это не поможет вам использовать этот сломанный веб-сервис.

Некоторые версии служб Apache, которые я видел, эффективно предполагают, что потребитель также использует Java, и фактически, что он уже знает об этих типах данных. Это просто сломано и не может быть исправлено, кроме как поставщиком сломанной веб-службы.

Я понимал, что более поздние версии Apache устранили эти проблемы, включив определение этих типов в WSDL.

Комментарии:

1. Использование многих «корпоративных» веб-служб Java в .net является болезненным опытом именно по этой причине.

2. Опять же, это глупость со стороны сотрудников Apache. Я надеюсь, что это уже исправлено, и в этом случае операционной системе потребуется только обновление.

3. Это совершенно новая установка Agile PLM. К сожалению, я не уверен, какая версия сервера и т.д. Используется. Я думаю, что в любом случае их служба SOAP все равно будет использовать тип «datahandler», который . Сеть не распознает.

4. Тот факт, что это .NET, не имеет значения. Им необходимо описать XML, который они хотят отправить для своего типа DataHandler.