2016-04-25 2 views
2

Я использую веб-сервис, который имеет различные методы, один из которых требует ввода xml.Определение класса метода мыльного устройства C#

Существует структура, которая должна быть передана для получения правильного ответа.

Я добавил ссылку на обслуживание в Visual Studio и вижу метод внутри класса контракта, который он сгенерировал.

Как создать правильный класс без phyisically получения файла .xsd и запускать xsd.exe для генерации класса? Поскольку в будущем может появиться изменение в формате xml, мне нужно будет снова запустить xsd.exe, что не очень хорошо.

Любые идеи, было бы здорово

Благодаря

+0

У вас есть доступ к сборкам веб-службе? В частности, сборки, которые содержат определение услуги? –

+0

У вебсервиса нужен класс или просто текст? Если это просто текст, все, что вам нужно сделать, это прочитать XML-файл и отправить его в виде текста. Сериализованный класс будет генерировать тот же xml, что и текстовый xml-файл, поэтому имеет смысл десериализовать xml-файл (создать класс), чтобы снова сериализовать (создать текст) тот же текст? – jdweng

ответ

1

Как могло изменение в будущем в формате XML, то я бы нужно запустить xsd.exe снова, не хорошо.

Вы совершенно правы в том, что создание определения контракта на обслуживание на стороне клиента не очень хорошо. Намного лучше ссылаться на фактические определения сервисов в сборке служб, а затем строить свой канал во время выполнения с использованием ChannelFactory<T>. Это гораздо лучший подход, чем использование сгенерированной ссылки на службы по многим причинам.

Есть только две вещи, которые могут стоять на вашем пути, с таким подходом:

  1. У вас нет доступа к двоичным файлам услуг. Obvioulsy вы должны иметь возможность использовать фактические типы, используемые для определения услуги.
  2. Сервисные двоичные файлы доступны, но скомпилированы в сборку «uber-assembly», содержащую всевозможные материалы, которые вам не безразличны и не обязательно хотят потреблять из вашего клиентского приложения.

Если первое из двух вышеуказанных условий истинно, тогда извините, но вы должны прибегнуть к сгенерированному прокси-серверу с помощью xsd.exe и принять все меры наказания, которые это нести. Если второе условие истинно, вы можете попросить владельца службы извлечь код определения службы в отдельную сборку для вас, и вы можете продолжить как обычно, используя описанный метод.

У меня есть класс под рукой, так можно использовать XML сериалайзер ... не я просто создать SOAPEnvelope, а затем добавить сгенерированный XML в теле запроса?

Я предполагаю, что служба также использует WCF?

Точка использования структуры, такой как WCF, заключается в том, что вам не нужно заботиться о сериализации, кодировании и передаче данных от клиента к службе. WCF заботится обо всем этом для вас. Все, что вам нужно сделать, это создать канал WCF с использованием определения службы (обычно это интерфейс, который определяет операции службы как методы на интерфейсе).

Затем вы можете вызвать эти методы против экземпляра канала, и запрос будет сериализован в XML, завернут в оболочку SOAP и передан по HTTP в службу, где запрос будет получен, развернут и десериализован, снова без любые усилия.

Существует пример здесь: https://stackoverflow.com/a/8869809/569662

+0

Привет, спасибо за ответ. Кажется, они будут гибкими, так как нам нужно предоставить им представление, поэтому у меня есть класс под рукой, поэтому можно использовать XML-сериализатор. Но вызов службы с использованием запроса xml я просто создаю soapEnvelope, а затем добавлю сгенерированный xml к телу запроса? – tjhack

+0

@tjhack Я обновил свой ответ –

Смежные вопросы