Как могло изменение в будущем в формате XML, то я бы нужно запустить xsd.exe снова, не хорошо.
Вы совершенно правы в том, что создание определения контракта на обслуживание на стороне клиента не очень хорошо. Намного лучше ссылаться на фактические определения сервисов в сборке служб, а затем строить свой канал во время выполнения с использованием ChannelFactory<T>
. Это гораздо лучший подход, чем использование сгенерированной ссылки на службы по многим причинам.
Есть только две вещи, которые могут стоять на вашем пути, с таким подходом:
- У вас нет доступа к двоичным файлам услуг. Obvioulsy вы должны иметь возможность использовать фактические типы, используемые для определения услуги.
- Сервисные двоичные файлы доступны, но скомпилированы в сборку «uber-assembly», содержащую всевозможные материалы, которые вам не безразличны и не обязательно хотят потреблять из вашего клиентского приложения.
Если первое из двух вышеуказанных условий истинно, тогда извините, но вы должны прибегнуть к сгенерированному прокси-серверу с помощью xsd.exe и принять все меры наказания, которые это нести. Если второе условие истинно, вы можете попросить владельца службы извлечь код определения службы в отдельную сборку для вас, и вы можете продолжить как обычно, используя описанный метод.
У меня есть класс под рукой, так можно использовать XML сериалайзер ... не я просто создать SOAPEnvelope, а затем добавить сгенерированный XML в теле запроса?
Я предполагаю, что служба также использует WCF?
Точка использования структуры, такой как WCF, заключается в том, что вам не нужно заботиться о сериализации, кодировании и передаче данных от клиента к службе. WCF заботится обо всем этом для вас. Все, что вам нужно сделать, это создать канал WCF с использованием определения службы (обычно это интерфейс, который определяет операции службы как методы на интерфейсе).
Затем вы можете вызвать эти методы против экземпляра канала, и запрос будет сериализован в XML, завернут в оболочку SOAP и передан по HTTP в службу, где запрос будет получен, развернут и десериализован, снова без любые усилия.
Существует пример здесь: https://stackoverflow.com/a/8869809/569662
У вас есть доступ к сборкам веб-службе? В частности, сборки, которые содержат определение услуги? –
У вебсервиса нужен класс или просто текст? Если это просто текст, все, что вам нужно сделать, это прочитать XML-файл и отправить его в виде текста. Сериализованный класс будет генерировать тот же xml, что и текстовый xml-файл, поэтому имеет смысл десериализовать xml-файл (создать класс), чтобы снова сериализовать (создать текст) тот же текст? – jdweng