SOAP-клиент в .NET - ссылки или примеры?

Фон:

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

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

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

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

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

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

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

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

Ответ 1

Предварительные условия: у вас уже есть служба и опубликован файл WSDL, и вы хотите вызвать свою веб-службу из клиентского приложения С#.

Есть 2 основных способа сделать это:

A) ASP.NET-сервисы, старый способ работы с SOA
B) WCF, как предположил Джон, является последней платформой от MS и предоставляет множество протоколов, включая открытые и проприетарные MS.

Добавление справочника услуг шаг за шагом

Самый простой способ - генерировать прокси-классы в приложении С# (этот процесс называется добавлением ссылки на службу).

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

    add service reference dialog

    Я использую http://www.dneonline.com/calculator.asmx?WSDL в качестве примера

  4. Разверните "Ссылки на службы" в обозревателе решений и дважды щелкните CalculatorServiceReference (или как вы назвали названную службу на предыдущем шаге).

    Вы должны увидеть сгенерированное имя прокси-класса и пространство имен.

    В моем случае пространство имен - SoapClient.CalculatorServiceReference, имя прокси-класса - CalculatorSoapClient. Как я уже говорил выше, имена классов могут отличаться в вашем случае.

    service reference proxy calss

  5. Перейдите к исходному коду С# и добавьте следующий

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

    Service1Client service = new Service1Client();
    int year = service.getCurrentYear();
    

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

Ответ 2

Я сделал довольно много того, о чем вы говорите, и SOAP-совместимость между платформами имеет одно основное правило: CONTRACT FIRST. Не выводите WSDL из кода, а затем пытайтесь создать клиент на другой платформе. Все, что больше, чем функции типа "Hello World", скорее всего, не сгенерирует код, не сможет говорить во время выполнения или (мой любимый), не сможет правильно отправить или получить все данные без повышения ошибки.

Тем не менее, WSDL - это сложный, неприятный материал, и я избегаю писать его с нуля, когда это возможно. Ниже приведены некоторые рекомендации по надежному взаимодействию служб (с использованием веб-ссылок, WCF, Axis2/Java, WS02, Ruby, Python и т.д.):

  • Идем дальше и делаем код сначала для создания вашего начального WSDL. Затем удалите свой код и заново создайте класс сервера из WSDL. Практически на каждой платформе есть инструмент для этого. Это покажет вам, какие странные привычки для вашей конкретной платформы есть, и вы можете начать настройку WSDL, чтобы быть более простым и понятным. Tweak, re-gen, повторите. Вы так много узнаете, и это портативные знания.
  • Придерживайтесь простых классов старого языка (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>:)

Ответ 3

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

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

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

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

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

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

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

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

Ответ 4

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

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();
    }
}

Ответ 6

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

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

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

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