|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
13. Создание и применение XML Web-службWeb-службы в приложениях ASP.NET 2.0, преимущества, файлы DISCO и WSDL Мы уже умеем предоставлять данные пользователям через Web-страницы, однако иногда возникает необходимость предоставлять данные не пользователям, а приложениям. Чтобы передать данные приложениям, используются Web-службы. Web-службы обеспечивают простую, гибкую, основанную на открытых стандартах модель для связывания приложений через Интернет. Web-службы позволяют связывать существующие приложения вне зависимости от их платформ, языков программирования, объектных моделей, которые используются для их реализации. Web-службы предназначены для прямого взаимодействия с другими приложениями через Интернет и по этой причине для них не предусматривается пользовательского интерфейса. Вместо пользовательского интерфейса Web-службы реализуют стандартные программные интерфейсы, которые называются контрактами. Web-службы: · независимы от языка программирования. Сами Web-службы можно реализовать на любом языке программирования, и программы, которые обращаются к Web-службам, также можно реализовать на любом языке программирования; · основаны на открытых протоколах и стандартах Интернета (HTTP, XML, SOAP); · не зависят от платформы, на которой они (или приложения) реализованы; · по умолчанию используют stateless service architecture (архитектуру работы со службами без сохранения состояния), которая является более масштабируемой. В ней каждый ответ Web-службы - это новый объект с новым состоянием. Однако вы вполне можете использовать и сохранение состояния (средствами State Management Services) - о них в следующей главе; · Web-службы работают в асинхронном режиме. В результате и Web-службы, и приложения-клиенты могут выполнять другие действия, пока, например, готовится ответ Web-службы. В самом простом варианте Web-службу можно представить как компонент, методы которого можно вызывать через Web. Для чего обычно используются Web-службы: · запросы аутентификации (пример такой открытой в Интернете Web-службы - Microsoft Passport); · службы, которые предоставляют информацию о прогнозах погоды для Web-сайтов; · информация по курсам валют; · информация о ценах на билеты (например, авиа); · цены на акции; · бронирование мест в гостиницах; · отслеживание прохождения заказа; · передача заголовков новостей и многое другое. На самом деле через Web-службы можно удобно реализовать любой обмен данными - защищенный, основанный на открытых стандартах, работающий без проблем через брандмауэры и т.п. Общий принцип работы с Web-службой выглядит так: · разработчик создает Web-службу; · разработчик помещает описание Web-службы в стандартном формате (публикует Web-службу) на специальном Web-сайте UDDI (Universal Description, Discovery and Integration); · разработчик клиентского Web-приложения запрашивает Web-сайт UDDI на предмет доступных Web-служб. В ответ возвращается список доступных Web-служб, в формате discovery files (DISCO) · он же выбирает нужный ему Web-сайт и через файл DISCO получает информацию об URL Web-службы и местонахождении документа Web Services Description Language (WSDL), в котором содержится вся необходимая информация о взаимодействии со службой; · на основе полученного документа WSDL создается прокси-объект для Web-службы. Этот объект позволяет обращаться к Web-службе как к обычному COM-компоненту; · прокси объект привязывается к Web-службе; · затем этот прокси-объект можно использовать обычным образом, например, на Web-форме. Подробнее о некоторых моментах. UDDI - специальная спецификации на публикацию информации о Web-службах. Информацию об этой спецификации и списки доступных в Интернете Web-служб доступны по адресам www.uddi.org и uddi.microsoft.com. Файлы обнаружения (discovery files, DISCO) - это файлы в формате XML, которые содержат ссылки (URL) на ресурсы, обеспечивающие информацию о Web-службе. Эти файлы обеспечивают возможность программного обнаружения Web-служб. Файлы обнаружения бывают двух разновидностей: · файлы *.disco - файлы статического обнаружения. Они автоматически генерируются Web-службой, когда к ней обращаются с URL-запросом, который оканчивается на ?DISCO. Пример такого файла: <?xml version="1.0" ?> <disco:discovery xmlns:disco="http://schemas.xmlsoap.org/disco" xmlns:wsdl="http://schemas.xmlsoap.org/disco/wsdl"> <wsdl:contractRef ref="http://MyWebServer/UserName.asmx?WSDL"/> </disco:discovery> · файлы *.vsdisco - файлы динамического обнаружения. Они автоматически генерируются VS.NET при создании ее средствами Web-службы. В нем указываются те каталоги, в которых поиск Web-служб производить не следует: <?xml version="1.0" encoding="utf-8" ?> <dynamicDiscovery xmlns="urn:schemas- dynamicdiscovery:disco.2000-03-17"> <exclude path="_vti_cnf" /> <exclude path="_vti_pvt" /> <exclude path="_vti_log" /> <exclude path="_vti_script" /> <exclude path="_vti_txt" /> <exclude path="Web References" /> </dynamicDiscovery> Файл WSDL - еще один XML-совместимый файл, который используется программно при создании прокси-класса для взаимодействия с Web-службой. Он содержит информацию о: · пути URL к Web-службе; · методы и свойства Web-службы; · используемые типы данных; · поддерживаемые протоколы взаимодействия. Общий план работы с Web-службами: 1) создаем файл .asmx и определяем в нем пространства имен, классы, свойства и Web-методы Web-службы; 2) указываем, какие методы и свойства будут доступны пользователям через Интернет. Для проверки функциональности Web-службы можно обратиться к нему напрямую из Web-броузера. Это - не нормальный режим работы Web-службы и применять его следует только для целей тестирования. Если обратиться из Web-броузера к службе напрямую, то вернется страница описания Web-службы в формате XML, на которой будет информация о всех методах этой Web-службы. Если вызывать из Web-броузера метод Web-службы, то вернутся возвращаемые этим методом данные (также в формате XML). На чаще всего Web-службу используют не напрямую, а опосредованно, через Web-форму. Для этого: 1) в проекте создают Web-reference для Web-службы. В результате создается файл *.vb или *.cs с исходным кодом для прокси-объекта, через который будет производиться работа с Web-службой. 2) проект компилится. Одновременно компилится и прокси класс и в виде модуля DLL помещается в каталог /bin. 3) в коде Web-формы создается объект WebReference. 4) вызываются методы Web-службы и возвращаемые ими данные используются на Web-форме. Несмотря на то, что обращение к Web-службам напрямую в итоге в приложениях не рекомендуется, во время разработки оно используется очень часто (например, для целей тестирования). Про это сейчас и будет рассказано. При обращении на Web-службу напрямую из броузера обычно вначале надо обратиться на начальную страницу Web-службы (*.asmx). Вам будет сгенерирована страница с списком методов и еще одной ссылкой - на страницу с формальным описанием Web-службы - WSDL contract (предназначенной для обработки программным способом). Нужно щелкнуть по ссылке с именем нужного метода. Откроется еще одна автоматически сгенерированная страница со списком параметров данного метода и полями для ввода значений этих параметров. После того, как все значения будут введены, можно нажать на кнопку Invoke. В ответ вам будет передан результат выполнения этого метода (в формате XML). А теперь - о программном вызове Web-служб через прокси-класс. О создании прокси-класса программным образом вам заботиться особо не нужно. Достаточно из графического интерфейса Solution Explorer добавить Web Reference и нужный прокси-класс будет создан автоматически. Для этого нужно щелкнуть правой кнопкой мыши по проекту и в контекстном меню выбрать Add -> Web Reference. Откроется окно, в котором вам будет предложено ввести URL страницы .asmx или wsdl. После того, как вы введете этот адрес, VS.NET автоматически обнаружит все доступные Web-службы и предложит вам выбрать нужную. Далее можно в коде Web-формы (например, в событийной процедуре для события Page_Load) просто создать требуемый объект прокси-класса: Dim ProxyGetStocks As New Client1.localhost.Service1 (возможно, вначале нужно будет нажать на F5, чтобы прокси-класс скомпилировался в сборку). А потом вызываем свойства Web-службы как обычные методы этого объекта: Label1.Text = ProxyGetStocks.HelloWorld и при необходимости передаем им параметры. Для каждого метода Web-службы автоматически генерируются три метода прокси класса: · метод, по имени просто совпадающий с методом Web-службы (в нашем случае HelloWorld); · метод, Begin_имя_метода (BeginHelloWorld); · метод End_имя_метода (EndHelloWorld). Обе последних разновидности предназначены для вызова/завершения работы метода в асинхронном режиме. При работе с Web-службой вполне вероятны ошибки следующих видов: · служба недоступна; · ответа от Web-службы приходится ждать очень долго; · в Web-службе произошла внутренняя ошибка (и вместо ожидаемых данных с Web-службы вернулось сообщение об ошибке). Конечно же, нужно настраивать обработчик ошибок для этих Web-служб. Как работать с этими ошибками: Для проблем, связанных с недоступностью Web-служб и тайм-аутами: · у создаваемого прокси-класса есть свойство Timeout. Для него можно установить значение (в миллисекундах), наиболее соответствующее вашей ситуации; · просто ловить тайм-аутные исключения: Try 'call the XML Web service Catch err As Exception Label1.Text = err.Message End Try Если проблема - не с тайм-аутом, а Web-службами (например, вы передали недопустимое значение параметра), то нужно работать с объектом SoapException: Try 'call your XML Web service Catch err As SoapException Label1.Text = "Unable to process your request" End Try Теперь, наконец, речь пойдет о том, как создавать сами Web-службы. При помощи шаблонов, которые есть в VS.NET, создаются они очень просто. Принципиально работа по созданию Web-службы выглядит так: · создаем в VS.NET новый проект на основе шаблона Web Service; · добавляем в него функции, которые будут доступны через Web (одна такая функция HelloWorld() уже помещена в шаблон для примера. Чтобы она заработала, достаточно ее раскомментировать; · компилилим проект; · тестируем его путем прямого доступа из броузера. После создания проекта Web-службы в проект автоматически помещается файл *.amsx и к нему - страница codebehind (*.asmx.vb или *.asmx.cs). Поскольку графический интерфейс для Web-службы не предусмотрен, на странице *.asmx по умолчанию расположен только служебный тег WebService: <%@ WebService Language="vb" Codebehind="Service1.asmx.vb" Class="WebService1.Service1" %> Все содержимое вполне очевидно. Атрибут Class идентифицирует базовый класс, на основе которого будет создан объект Web-службы. По умолчанию код страницы codebehind тоже очень простой. Если исключить код, сгенерированный дизайнером и некоторые комментарии, то он выглядит так: Imports System.Web.Services <WebService(Namespace := "http://tempuri.org/")> _ Public Class Service1 Inherits System.Web.Services.WebService '<WebMethod()> Public Function HelloWorld() As String ' HelloWorld = "Hello World" ' End Function End Class Каждую функцию, которая станет открытым для доступа методом Web-службы, нужно пометить тегом <WebMethod()>.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
Получить учебные материалы по этому курсу |
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||