SOAP-клиент в .NET - ссылки или примеры? - PullRequest
66 голосов
/ 23 июня 2010

Справочная информация:

Я создаю сайт веб-сервисов, который будет предоставлять множество типов простых сервисов через SOAP и, возможно, другие протоколы.Цель состоит в том, чтобы упростить, например, преобразования, разбор RSS, проверку на спам и многие другие виды работ.Сайт будет ориентирован в основном на начинающих разработчиков.

Моя проблема:

Я никогда не разрабатывал ни C #, ни .NET по этому вопросу.Я взломал VB6 много лет назад, но это все.Теперь мне нужны примеры выполнения вызовов RPC через SOAP в C # .Я пытался найти в Интернете и переполнении стека, чтобы найти это, но не нашел много ресурсов, и я не знаю, как ранжировать ресурсы (старые, неправильные и т. Д.).

Я создал простой пример сервиса, который в PHP называется так:

<?php
$client = new SoapClient('http://webservi.se/year'); //URL to the WSDL
echo $client->getCurrentYear(); //This method returns an integer, called "year"
?>

Теперь я хочу как можно проще вызвать этот метод в C #.Все ссылки и примеры очень приветствуются.С чего бы мне начать?Какие классы / модули / что я могу использовать?

Решение вообще не должно включать SOAP, если есть более совершенные коммуникационные структуры (серверная часть должна быть расширяемой), но обратите внимание, что сторона серверареализовано в PHP на Unix, поэтому проприетарные решения от Microsoft не обсуждаются на стороне сервера.

Обратите внимание, что мне это нужно, чтобы я мог написать документацию, которой может следовать J. Random Web Developer (даже если онина общем веб-хостинге).Поэтому я думаю, что лучший подход должен заключаться в том, чтобы делать это только в коде, но даже другие способы сделать это, конечно, приветствуются.

Ответы [ 6 ]

131 голосов
/ 09 июля 2011

Как я понимаю, вы хотите вызвать свой веб-сервис из клиентского приложения C #.У вас уже есть сервис и опубликован файл WSDL (поправьте меня, если я ошибаюсь).Теперь самый простой способ - создать прокси-классы в приложении C # (этот процесс называется добавлением ссылки на службу).Существует два основных способа сделать это: .NET предоставляет службы ASP.NET, что является старым способом работы с SOA, и WCF, как предложил Джон, который является новейшей платформой от MS и предоставляет множество протоколов, включая открытые и проприетарные MS.

Теперь достаточно теории, и давайте сделаем это шаг за шагом

  1. Откройте ваш проект (или создайте новый) в visual studio
  2. Щелкните правой кнопкой мыши проект(в проекте, а не в решении) в обозревателе решений и нажмите Добавить ссылку на службу
  3. Появится диалоговое окно, показанное на снимке экрана ниже.Введите URL-адрес вашего файла WSDL и нажмите ОК.Обратите внимание: если после нажатия кнопки ОК вы получите сообщение об ошибке, попробуйте удалить часть? Wsdl из URL.screen

  4. Разверните Сервисные ссылки в обозревателе решений и дважды щелкните ServiceReference1 (имя может отличаться).Вы должны увидеть сгенерированное имя прокси-класса и пространство имен.В моем случае пространство имен - WindowsFormsApplication1.ServiceReference1, имя прокси-класса - Service1Client.Как я уже говорил выше, имена классов могут отличаться в вашем случае.enter image description here

  5. Перейдите к исходному коду C #.Добавьте using WindowsFormsApplication1.ServiceReference1.

  6. Теперь вы можете позвонить в службу таким образом.

Service1Client service = new Service1Client();

int year = service.getCurrentYear();

Надеюсь, это поможет, если у вас возникнут какие-либо проблемы, сообщите нам.

24 голосов
/ 14 июля 2011

Я сделал довольно многое из того, о чем вы говорите, и совместимость SOAP между платформами имеет одно кардинальное правило: КОНТРАКТ ПЕРВЫЙ. не получайте свой WSDL из кода, а затем попытайтесь сгенерировать клиента на другой платформе.Все, кроме функций типа «Hello World», с большой вероятностью не сможет генерировать код, не сможет говорить во время выполнения или (мой любимый) не сможет правильно отправить или получить все данные без возникновения ошибки.

Это сказалоWSDL - сложная, неприятная штука, и я стараюсь не писать ее с нуля, когда это возможно.Вот несколько рекомендаций по надежному взаимодействию сервисов (с использованием Web References, WCF, Axis2 / Java, WS02, Ruby, Python и т. Д.):

  • Идите вперед и сделайте код первым, чтобы создать исходный WSDL,Затем удалите свой код и заново сгенерируйте класс (ы) сервера из WSDL.Практически на каждой платформе есть инструмент для этого.Это покажет вам, какие странные привычки у вашей конкретной платформы, и вы можете начать настраивать WSDL, чтобы быть проще и понятнее.Твик, реген, повтор.Таким образом, вы многому научитесь, и это портативное знание.
  • Используйте сложные классы старого языка (POCO, POJO и т. Д.) Для сложных типов.НЕ используйте платформо-зависимые конструкции, такие как List <> или DataTable.Даже PHP-ассоциативные массивы будут работать, но не будут работать способами, которые трудно отладить на разных платформах.
  • Придерживайтесь базовых типов данных: bool, int, float, string, date (Time) и массивов.Скорее всего, чем конкретнее вы будете относиться к типу данных, тем менее гибкими вы будете со временем к новым требованиям.Вы НЕ хотите менять свой WSDL, если можете этого избежать.
  • Единственное исключение из типов данных выше - предоставьте себе какой-нибудь механизм NameValuePair.Вы не поверите, сколько раз список этих вещей спасет ваш бекон с точки зрения гибкости.
  • Установите реальное пространство имен для вашего WSDL.Это не сложно, но вы можете не верить, сколько веб-сервисов я видел в пространстве имен "http://www.tempuri.org". Также используйте URN (" urn: com-myweb-servicename-v1 ", а не пространство имен на основе URL (" http://servicename.myweb.com/v1". Это не веб-сайт, это абстрактный набор символов, который определяет логическую группировку. Вероятно, меня попросили дюжину людей обратиться за поддержкой и сказать, что они пошли на «веб-сайт», и это не сработало.

</rant>:)

7 голосов
/ 15 июля 2011

Если вы можете заставить его работать в браузере, то что-то настолько простое, как это будет работать

var webRequest = WebRequest.Create(@"http://webservi.se/year/getCurrentYear");

using (var response = webRequest.GetResponse())
{
    using (var rd = new StreamReader(response.GetResponseStream()))
    {
        var soapResult = rd.ReadToEnd();
    }
}
7 голосов
/ 09 июля 2011

Взгляните на " с использованием WCF Services with PHP ". Он объясняет основы того, что вам нужно.

Как резюме теории:

WCF или Windows Communication Foundation - это технология, которая позволяет определять службы, абстрагированные от способа - базового метода связи - они будут вызываться.

Идея состоит в том, что вы определяете договор о том, что служба делает и что предлагает услуга, а также другой договор о том, какой метод связи используется для фактического использования сервиса, будь то TCP, HTTP или SOAP.

У вас есть первая часть статьи здесь , объясняющая, как создать очень простую службу WCF.

Дополнительные ресурсы:

Использование WCF с PHP5 .

Также взгляните на NuSOAP. Если вы сейчас NuSphere , это инструментарий, позволяющий подключаться из PHP к службе WCF.

6 голосов
/ 23 июня 2010

Вы смотрите не в том месте. Вы должны посмотреть Windows Communication Framework .


WCF используется как на клиенте, так и на сервере.

5 голосов
/ 12 июля 2011

Здесь вы можете найти хороший учебник по вызову веб-службы на основе NuSOAP из клиентского приложения .NET.Но IMO, вам также следует рассмотреть WSO2 Web Services Framework для PHP (WSO2 WSF / PHP) для обслуживания.См. WSO2 Web Services Framework для PHP 2.0, значительно расширяющий возможности единственной в отрасли библиотеки PHP для создания служб SOAP и REST .Существует также веб-семинар .

Теперь в мире .NET я также рекомендую использовать WCF, принимая во внимание проблемы совместимости.Пример взаимодействия может быть найден здесь , но этот пример использует PHP-клиент + WCF-сервис вместо противоположного.Не стесняйтесь внедрять PHP-сервис и WFC-клиент.

На сайте codeplex.com есть несколько проектов с открытым исходным кодом, связанных с WCF, которые я считаю очень продуктивными.Эти проекты очень полезны для разработки и реализации приложений Win Forms и Windows Presentation Foundation: Smart Client , Веб-клиент и Мобильный клиент .Их можно использовать в сочетании с WCF для разумного вызова любых веб-сервисов.

Вообще говоря, команда по шаблонам и практикам обобщает передовые практики и проекты в различных проектах с открытым исходным кодом, связанных с платформой .NET, особенно для Интернета.Поэтому я думаю, что это хорошая отправная точка для любого дизайнерского решения, связанного с клиентами .NET.

...