Прийоми розробки ASMX веб-сервісів

розробки
У цій статті я розповім про різні прийоми розробки SOAP веб-сервісів за технологією ASMX, а також про цю технологію в цілому. Крім SOAP, також буде розглянуто реалізацію AJAX. Стаття буде корисна як тим, хто вже знайомий з нею, так і тим, хто тільки збирається створити свій перший веб-сервіс. до файлів web.config Множинні asmx файли Заміна веб-сторінки Заміна розширення Приховування wsdl Винятки soap: Header Кешування SoapExtension Дебаггінг x64 у Visual Studio Деплой (публікація) . У 2002 році у складі першої версії ASP.NET 1.0 вона представила технологію ASMX (Active Server Method Extended), яка дозволила розробникам у новітній Visual Studio 2002 легко створювати та споживати SOAP веб-сервіси. Зазначу, що ця технологія офіційно на MSDN має назву "XML Web Services". У ті роки SOAP тільки робив перші серйозні кроки у світі веб-розробок. Консорціум W3C схвалив SOAP 1.1 у 2000 році, SOAP 1.2 у 2003 році (доповнений у 2007 році). Тому було дуже важливо зробити для нового стандарту легку в освоєнні та застосуванні технології. І ця мета була досягнута - щоб працювати з веб-сервісами, розробнику навіть не обов'язково було знати XML, SOAP і WSDL. У наступні роки технологія ASMX отримала дуже широке поширення та визнання. Також із самого початку Microsoft постачала до неї аддон Web Services Enhancements (WSE), який дозволяв реалізовувати різні специфікації безпеки WS-* такі, якWS-Security, WS-Policy, WS-ReliableMessaging. Остання версія - WSE 3.0 вийшла 2005 року. А в 2007 році у складі .NET 3.0 було представлено технологію Windows Communication Foundation (WCF), яка стала офіційною заміною ASMX. Незважаючи на те, що технологія ASMX вже давно не розвивається, вона продовжує широко використовуватись та підтримується новітніми версіями .NET Framework.

ASMX і WCF Цікаво порівняти, скільки веб-сервісів обох типів бачить Google: 314 000 ASMX і 6 280 WCF Чому ж технологія ASMX все ще така популярна? Все дуже просто: вона легка у застосуванні і чудово вирішує завдання здебільшого. Перевага WCF проявляється, наприклад, у випадках, коли вам потрібна висока швидкість транспорту, дуплекс, потокова передача, дотримання сучасних стандартів безпеки, REST. До речі, якщо вам потрібен тільки REST, то замість WCF варто використовувати технологію ASP.NET Web API. Перерахуємо саме плюси кожної технології: Плюси ASMX:

Легкість у розробці Легкість у вивченні Немає «пекла» конфігурування Плюси WCF: Дуже різноманітні та гнучкі можливості транспорту Актуальна та технологія, що розвивається Різні варіанти хостингу Можливість реалізації великої множини стандартів WS-* Отже, WCF — це «швейцарський ніж» у галузі транспорту даних, а ASMX - "добротна викрутка". І найкраще, звісно, ​​вміти користуватися обома інструментами. Оскільки прийоми розробки WCF в інтернеті описані більш повно та актуально, я вирішив, що потрібно написати статтю про ASMX, яка стане у нагоді тим, кому доводиться підтримувати старі веб-сервіси, і тим, хто продовжує застосовувати цю технологію для створення нових.

розробки
Вступ У статті описано 20 різних практичних прийомів, які можна застосувати при розробці веб-сервісів за цією технологією.Сценарій для прикладів буде наступним. Є база даних фінансових звітів, що регулярно поповнюється. Необхідно розробити універсальний механізм, за допомогою якого у різних клієнтів завжди будуть актуальні дані щодо цих звітів. Рішення: пишемо SOAP веб-сервіс з двома методами: Перший метод приймає період у часі і повертає ідентифікатори всіх звітів, які з'явилися в цьому періоді вказуючи період з моменту їх останнього запиту, і за наявності у відповіді ідентифікаторів, запитують дані через другий метод. ».

1. Найпростіша конструкція Почнемо з опису найпростішої конструкції веб-сервісу. Увага, приклад має виключно теоретичний характер! Хоч він і робітник, ніколи так не робіть на практиці. Це лише демонстрація простоти самої технології ASMX. Створіть у Visual Studio новий проект ASP.NET Empty Web Application або ASP.NET Web Service Application з ім'ям FinReportWebService. Додайте до нього два файли: FinReport.asmx і FinReportService.cs, причому FinReport.asmx додайте як Text File, а не Web Service, щоб це був одиночний файл.

FinReportService.cs using System; using System.Web.Services; namespace FinReportWebService

Натисніть F5 для запуску веб-сервера та відкрийте у браузері FinReport.asmx, ви повинні побачити

asmx

Готово. Тепер розберемо по порядку. Веб-сервіс представлений одним звичайним класом з однією лише обов'язковою особливістю - деякі його методи позначені спеціальним атрибутом[WebMethod]. Такі методи класу стають веб-методами веб-сервісу із відповідною сигнатурою виклику. Цей клас повинен мати конструктора за замовчуванням. При кожному новому запиті IIS його інстанцує дефолтним конструктором та викликає відповідний метод.

Друга обов'язкова частина мінімальної конструкції – це файл із розширенням asmx, усередині якого необхідно вказати цей клас.

Цікаво порівняти цей вручну створений файл asmx з тим, який створить Visual Studio. Припустимо, ми хочемо зробити ще один веб-сервіс, який повертає курс обміну валют. Додайте через меню Add New Item файл ExchangeRate.asmx з типом Web Service.

прийоми

Натиснувши один-два рази на F7, можна побачити таке:

using System; using System.Web.Services; використовуючи System.Xml.Serialization; namespace FinReportWebService

Розберемо зміни. Атрибут [WebServiceBinding (ConformsTo = WsiProfiles.BasicProfile1_1)] означає, що веб-сервіс перевіряється на відповідність специфікації WSI Basic Profile 1.1. Наприклад, за нею заборонено перевантаження імені операції, або застосування атрибуту [SoapRpcMethod]. Такі порушення призводять до помилки веб-сервісу «Служба FinReportWebService.FinReportService не відповідає специфікації Simple SOAP Binding Profile Version 1.0.». За відсутності цього атрибуту порушення будуть призводити лише до попередження: «Ця веб-служба не відповідає вимогам WS-I Basic Profile v1.1.». У загальному випадку рекомендується додавати цей атрибут, що забезпечує велику інтероперабельність. у браузеріName - ім'я веб-сервісу (задефолту береться ім'я класу)

Спадкування від класу WebService дає доступ до об'єктів HttpContext, HttpSessionState та деяких інших, що в деяких випадках може бути корисним.

В атрибуті [WebMethod (Description = «Отримання звіту за ID»)] зазвичай вказують лише Description, який описує веб-метод у браузері, інші властивості використовуються рідко.

Вхідні параметри і значення, що повертаються, я особисто рекомендую інкапсулювати в спеціальні класи. Наприклад, я їх називаю, додаючи суфікси -Arg та -Result до назви методу, що означає аргумент та результат. У цьому прикладі для спрощення всі вони знаходяться в одному файлі FinReportService.cs, але в реальних проектах кожен з них я розміщую в окремому файлі в спеціальній папці типу FinReportServiceTypes. Також їх зручно наслідувати від загальних класів.

За ідеєю, до всіх власних класів у веб-методах потрібно вказувати атрибути [Serializable] і [XmlType (Namespace = FinReportService.XmlNS)]. Однак у цьому випадку це не обов'язково. Адже якщо здійснюється тільки XML-серіалізація, то атрибут [Serializable] не потрібен, а XML неймспейс і так береться за замовчуванням з атрибуту [WebService]. Зазначу, що на відміну від WCF у ASMX використовується звичайний XmlSerializer, що дозволяє широко керувати серіалізацією за допомогою таких стандартних атрибутів як [XmlType], [XmlElement], [XmlIgnore] тощо.

3. Проксі-клас за допомогою wsdl.exe Утиліта wsdl.exe є відповідною для asmx технікою споживання SOAP веб-сервісів. За wsdl файлом або посиланням вона генерує проксі-клас - спеціальний клас, що максимально спрощує звернення до даного веб-сервісу. Зрозуміло, не важливо на якій технології реалізований сам веб-сервіс, це може бути будь-що - ASMX, WCF, JAX-WS або NuSOAP. До речі, у WCFаналогічна утиліта називається SvcUtil.exe. Утиліта розташована в папці C: Program Files (x86) Microsoft SDKs Windows, більше того, вона там представлена ​​в різних версіях, залежно від версії .net, розрядності, версії windows і visual studio.

розробки

wsdl http:// 192.168.1.101 :8080/SomeDir/SomeService? wsdlwsdl HabraService.wsdl

Давайте зробимо клієнта для FinReportWebService. У поточному або новому солюшені створіть новий Windows Forms проект FinReportWebServiceClient. Додайте в ньому папку ProxyClass, скопіюйте у неї утиліту wsdl.exe і створіть у ній батник GenProxyClass.bat: wsdl /n: FinReportWebServiceClient.ProxyClass http://localhost:3500/FinReport.asmx? wsdlpause

За допомогою аргументу /n: FinReportWebServiceClient.Proxy />

На формі додайте кнопку, а вихідний код форми наступні три методи:

Найважливішими властивостями проксі-класу є Url і Timeout, причому тайм вказується в мілісекундах і 100 секунд це його дефолтне значення. Тепер за допомогою них можна протестувати роботу веб-сервісу. Демонстрація роботи подальших прийомів буде показана через виклик методу GetReport і заповнення поля result.Report.Info.

wsdl /n: MyNamespace HabraService.wsdl Data.xsd Common.xsd Schema.xsd

Однак, крім ручного створення проксі-класу Visual Studio дозволяє його створити автоматично. Пункт "Add Service Reference" дозволяє створити проксі-клас з технології WCF, і там же в "Advanced" є кнопка "Add Web Reference", яка створює його вже за технологією ASMX.4. Серверний клас за даним wsdl Як відомо, wsdl опис веб-сервісу в технології ASMX генеруєтьсяавтоматично. Однак іноді виникає зворотне завдання: за даним файлом wsdl розробити відповідний йому веб-сервіс. Вирішується вона за допомогою тієї ж утиліти wsdl.exe. Вона може створити необхідний скелет із класів і вам залишиться лише реалізувати програмну логіку веб-методів. Для прикладу візьмемо wsdl нашого веб-сервісу. Збережіть його з браузера як файл FinReport.wsdl або скопіюйте звідси:

FinReport.wsdl Фін. звіти Отримання списку ID звітів за періодом Отримання звіту ID Фін. звіти

Створіть у солюшені новий порожній web-проект із ім'ям FinReportWebServiceByWsdl. Додайте папку ServerClass, до якої скопіюйте файли FinReport.wsdl і wsdl.exe. Створіть в ній GenServerClass.bat: wsdl /server /n: FinReportWebServiceByWsdl.ServerClass FinReport.wsdlpause

Запустивши його, потрібно отримати файл FinReportService.cs. Усі чотири файли увімкніть у солюшен.

розробки

Отже, як бачимо, єдина відмінність від генерації проксі-класу це атрибут server. При цьому створюється абстрактний клас, успадкований від WebService з абстрактно описаними веб-методами. Можна від нього успадковуватись, але при цьому все одно доведеться копіювати всі атрибути, тому пропоную зробити таким чином. Скопіювати визначення класу в новий файл та простір імен, прибрати слово abstract та написати реалізацію методів. Після форматування коду у мене вийшов наступний файл