Клієнт SOAP у .NET - посилання чи приклади?


76

Передумови:

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

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

Я ніколи не розробляв жодного C # або .NET з цього приводу. Я багато років тому зламав VB6, але це все. Тепер мені потрібні кілька прикладів здійснення викликів RPC через SOAP у C # . Я намагався здійснити пошук в Інтернеті та 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"
?>

Тепер я хочу викликати цей метод якомога легше в C #. Всі посилання та приклади дуже вітаються. З чого почати? Які класи / модулі / що б я не міг використати?

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

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


Чи щось заважає вам створити посилання на службу до URL-адреси WSDL у вашому проекті?
Фредерік Хаміді

1
Фредерік, моя головна проблема полягає в тому, що я не маю уявлення про те, як ASP.NET справляється з цим. Що таке "довідковий сервіс"? чи можна це робити лише з кодом, чи я повинен якось вказувати і натискати? Зауважте, що мені це потрібно, щоб я міг писати документацію, яку можна слідкувати за J. Random Web Developer (навіть якщо вони перебувають на спільному веб-хостингу).
Emil Vikström

@Emil, тут задіяні наведення та клацання, щоб сформувати код C # для класів, описаних у документі WSDL. Після цього не надто багато коду, якщо URL-адреса служби ніколи не змінюється. Див. Цю статтю про MSDN .
Фредерік Хаміді

Відповіді:


153

Передумови : Ви вже маєте службу та опублікували файл WSDL, і ви хочете зателефонувати до своєї веб-служби з клієнтської програми C #.

Є 2 основні способи зробити це:

A) Служби ASP.NET , що є старим способом виконання SOA
B) WCF , як запропонував Джон, що є останньою структурою від MS і забезпечує безліч протоколів, включаючи відкриті та власні.

Покрокове додавання посилання на послугу

Найпростіший спосіб - це створення проксі-класів у програмі C # (цей процес називається додаванням посилання на службу).

  1. Відкрийте свій проект (або створіть новий) у візуальній студії
  2. Клацніть правою кнопкою миші на проекті (на проекті, а не на рішенні) у Провіднику рішень та натисніть Додати посилання на службу
  3. Має з'явитися діалогове вікно, показано на знімку екрана нижче. Введіть URL-адресу вашого файлу wsdl і натисніть Ok. Зверніть увагу: якщо після натискання кнопки ОК ви отримаєте повідомлення про помилку, спробуйте видалити частину? Wsdl з url.

    додати діалогове вікно посилання на службу

    Я використовую http://www.dneonline.com/calculator.asmx?WSDL як приклад

  4. Розгорніть посилання на служби в Провіднику рішень і двічі клацніть CalculatorServiceReference(або те, що ви назвали іменованою службою на попередньому кроці).

    Ви повинні побачити згенеровану назву класу проксі та простір імен.

    У моєму випадку простір імен - SoapClient.CalculatorServiceReferenceце ім’я класу проксі CalculatorSoapClient. Як я вже говорив вище, назви класів можуть відрізнятися у вашому випадку.

    довідковий проксі сервіс calss

  5. Перейдіть до вихідного коду C # і додайте наступне

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

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

Сподіваюся, це допомагає. Якщо у вас виникнуть проблеми, повідомте нас.


4
Дякую за вашу відповідь. Я дуже ціную скріншоти та опис теорії. Навіть якщо теорія може бути легкою, це все одно нове середовище для мене. Я спробую це.
Emil Vikström

7
Немає проблем :) Повірте мені, це теж легко на практиці. і якщо у вас виникнуть якісь проблеми, ТО означає, що ви допомагаєте одне одному, так? :-)
Давіта

Еміле, вам може бути цікаво дізнатись, що під екранами графічного інтерфейсу, що відображаються вище, програма wsdl.exe робить важку роботу. Ви можете запустити це самостійно з командного рядка і переглянути код, який для вас генерується.
mtutty

1
Як зазначено нижче іншим коментатором, у C # Windows Communication Foundation (wcf) представлена ​​як технологія хостингу, так і послуги дзвінків. Вище показано, як автоматично створювати проксі-сервери WCF у Visual Studio, і є одним із багатьох способів зробити це, включаючи створення проксі-серверів за допомогою wsdl.exe, як зазначив mtutty.
TRayburn

1
Здається, я не можу знайти Service1Client service = new Service1Client();У моєму просторі serviceReference Name є просто класи WSDL?
Zapnologica

25

Я зробив досить багато з того, про що ви говорите, і взаємодія SOAP між платформами має одне головне правило: ПЕРШИЙ ДОГОВОР. Як НЕ отримати свій WSDL з коду , а потім спробувати створити клієнт на іншій платформі. Будь-що більше, ніж функції типу "Hello World", швидше за все, не зможе згенерувати код, не зможе розмовляти під час виконання або (мій улюблений) не зможе належним чином надіслати або отримати всі дані без помилки.

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

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

</rant> :)


1
Хороший матеріал! Це не те, про що я просив, але ти все одно відповів на багато питань, які я думав про себе. "Договір насамперед" здається ключовим навіть у моїй ситуації тут.
Emil Vikström

7

Якщо ви можете змусити його запуститись у браузері, тоді спрацює щось таке просте, як це

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

Погляньте на " використання служб WCF з PHP ". Це пояснює основи того, що вам потрібно.

Як теоретичний підсумок:

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

Ідея полягає в тому, що ви визначаєте договір про те, що робить послуга і що пропонує послуга, а також визначаєте інший контракт про те, який метод зв'язку використовується для фактичного споживання послуги, будь то TCP, HTTP або SOAP.

У вас є перша частина статті тут , пояснюючи , як створити дуже просту службу WCF.

Більше ресурсів:

Використання WCF з PHP5 .

Також погляньте на NuSOAP. Якщо ви зараз користуєтеся NuSphere, це набір інструментів для підключення з PHP до служби WCF.


Дякую. Я вже кодую на PHP, тому я добре знаю NuSOAP. Мені знадобиться клієнтський код для C #.
Emil Vikström

6

Ви шукаєте не в тому місці. Вам слід шукати Windows Communication Framework .


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


Дякую, я перевірю це. Можливо, там є кілька порад, навіть якщо я не запускаю їх на стороні сервера.
Emil Vikström

5

Тут ви можете знайти гарний підручник для виклику веб-служби на базі 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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.