SOAP-клиент в.NET - ссылки или примеры?
Фон:
Я создаю сайт веб-сервисов, который будет предоставлять множество типов простых сервисов через 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 ответов
Как я понимаю, вы хотите вызвать свой веб-сервис из клиентского приложения C#. У вас уже есть сервис и опубликован файл WSDL (поправьте меня, если я ошибаюсь). Теперь самый простой способ - создать прокси-классы в приложении C# (этот процесс называется добавлением ссылки на службу). Существует два основных способа сделать это:.NET предоставляет службы ASP.NET, что является старым способом работы с SOA, и WCF, как предложил Джон, который является новейшей платформой от MS и предоставляет множество протоколов, включая открытые и проприетарные MS.
Теперь достаточно теории и давайте сделаем это шаг за шагом
- Откройте свой проект (или создайте новый) в visual studio
- Щелкните правой кнопкой мыши проект (на проекте, а не на решении) в обозревателе решений и выберите Добавить ссылку на службу.
Должен появиться диалог, показанный на скриншоте ниже. Введите URL-адрес вашего файла WSDL и нажмите ОК. Обратите внимание: если после нажатия кнопки ОК вы получите сообщение об ошибке, попробуйте удалить часть? Wsdl из URL.
Разверните Сервисные ссылки в Обозревателе решений и дважды щелкните ServiceReference1 (имя может отличаться). Вы должны увидеть сгенерированное имя прокси-класса и пространство имен. В моем случае пространство имен - WindowsFormsApplication1.ServiceReference1, имя прокси-класса - Service1Client. Как я уже говорил выше, имена классов могут отличаться в вашем случае.
Перейдите к исходному коду C#. добавлять
using WindowsFormsApplication1.ServiceReference1
,- Теперь вы можете позвонить в службу таким образом.
Service1Client service = new Service1Client();
int year = service.getCurrentYear();
Надеюсь, что это поможет, если у вас возникнут какие-либо проблемы, дайте нам знать.
Я сделал довольно многое из того, о чем вы говорите, и совместимость SOAP между платформами имеет одно основное правило: КОНТРАКТ ПЕРВЫЙ. Не извлекайте ваш WSDL из кода, а затем попытайтесь сгенерировать клиента на другой платформе. Все, что не относится к функциям типа "Hello World", скорее всего не сможет генерировать код, не будет говорить во время выполнения или (мой любимый) не сможет правильно отправить или получить все данные без возникновения ошибки.
Тем не менее, WSDL - сложная, неприятная штука, и я стараюсь не писать ее с нуля, когда это возможно. Вот несколько рекомендаций по надежному взаимодействию сервисов (с использованием Web References, WCF, Axis2/Java, WS02, Ruby, Python и т. Д.):
- Идите вперед и выполните code-first, чтобы создать исходный 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>
:)
Если вы можете заставить его работать в браузере, то что-то простое, как это будет работать
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();
}
}
Взгляните на " использование WCF Services с PHP ". Это объясняет основы того, что вам нужно.
В качестве резюме теории:
WCF или Windows Communication Foundation - это технология, которая позволяет определять службы, абстрагированные от способа - базовый метод связи - они будут вызываться.
Идея заключается в том, что вы определяете договор о том, что служба делает и что предлагает служба, а также определяете другой договор о том, какой метод связи используется для фактического использования сервиса, будь то TCP, HTTP или SOAP.
Здесь у вас есть первая часть статьи, в которой объясняется, как создать базовую службу WCF.
Больше ресурсов:
Также взгляните на NuSOAP. Если вы сейчас используете NuSphere, то это инструментарий, позволяющий подключаться из PHP к службе WCF.
Вы смотрите не в том месте. Вы должны посмотреть Windows Communication Framework.
WCF используется как на клиенте, так и на сервере.
Здесь вы можете найти хороший учебник по вызову веб-службы на основе 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, Web Client и Mobile Client. Их можно использовать в сочетании с WCF для разумного вызова любых веб-сервисов.
Вообще говоря, команда шаблонов и практик обобщает лучшие практики и проекты в различных проектах с открытым исходным кодом, которые имеют дело с платформой.NET, особенно для Интернета. Поэтому я думаю, что это хорошая отправная точка для любого дизайнерского решения, связанного с клиентами.NET.