#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.