Пользование web-службой
В Интернете существует множество готовых web-служб. Сайты http://uddi.microsoft.com, http://www.webservicelist.com/ — каталоги различных сервисов. Чтобы получить информацию от web-службы, нужно только послать HTTP-запрос, в теле которого находится SOAP-сообщение. Запрос к службе http://www.webservicex.net/globalweather.asmx на получение прогноза погоды в Москве выглядит так:
POST /globalweather.asmx HTTP/1.1 Host: www.webservicex.net Content-Type: text/xml; charset=utf-8 Content-Length: length SOAPAction: "http://www.webserviceX.NET/GetWeather"
<?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema- instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <GetWeather xmlns="http://www.webserviceX.NET"> <CityName>Moscow</CityName> <CountryName>Russian</CountryName> </GetWeather> </soap:Body> </soap:Envelope>
Заголовок запроса отличается от запросов, которые обычно посылают браузеры, прежде всего полем Content-Type — text/xml; а не text/html; В теле запроса находится SOAP-сообщение.
Сервис в ответ оправляет XML-документ:
<?xml version="1.0" encoding="utf-8" ?> <string xmlns="http://www.webserviceX.NET"> <?xml version="1.0" encoding="utf-16"?> <CurrentWeather> <Location>Moscow / Vnukovo , Russia (UUWW) 55-39N 037- 16E</Location> <Time>Aug 07, 2006 - 04:30 AM EDT / 2006.08.07 0830 UTC</Time> <Wind> from the E (080 degrees) at 11 MPH (10 KT):0</Wind> <Visibility> greater than 7 mile(s):0</Visibility> <SkyConditions> overcast</SkyConditions> <Temperature> 66 F (19 C)</Temperature> <DewPoint> 55 F (13 C)</DewPoint> <RelativeHumidity> 68%</RelativeHumidity> <Pressure> 29.85 in.
Hg (1011 hPa)</Pressure> <Status>Success</Status> </CurrentWeather></string>
Чтобы сделать проект ASP .NET потребителем web-сервиса, первым делом в проекте надо создать web-ссылку на удаленный объект — web-сервис. Выберите в меню Website пункт Add Web Reference. Появится диалоговое окно.
увеличить изображение
Рис. 16.1.
Введите URL web-сервиса с параметром wsdl в текстовое поле www.webservicex.net/globalweather.asmx?WSDL. В файл web.config добавляется настройка приложения:
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0"> <appSettings> <add key="weather.webservicex.www.globalweather" value="http://www.webservicex.net/globalweather.asmx"/> </appSettings> <connectionStrings>
Чтобы определить доступные по этому адресу web-сервисы, используется алгоритм DISCO.
При этом создается файл globalweather.wsdl. WSDL (Web Service Discovery Language) — это язык описания web-сервисов. Это еще один тип XML-документов.
<?xml version="1.0" encoding="utf-8"?> <wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://www.webserviceX.NET" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" targetNamespace="http://www.webserviceX.NET" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> <wsdl:types> <s:schema elementFormDefault="qualified" targetNamespace="http://www.webserviceX.NET"> <s:element name="GetWeather">
Создание web-ссылки добавляет в конфигурационный файл еще одну запись:
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0"> <appSettings> <add key="weather.webservicex.www.globalweather" value="http://www.webservicex.net/globalweather.asmx"/> </appSettings>
Чтобы облегчить работу с web-сервисами, используют прокси-классы. Они предоставляют разработчикам удобные функции и берут на себя преобразование их параметров в элементы XML, после чего посылают запрос web-сервису через Интернет.
Утилита wsdl поможет преобразовать его в прокси-класс:
wsdl globalweather.wsdl
Прокси-класс необходимо поместить в папку App_Code, после чего объекты этого класса можно создавать в коде любой страницы.
Программу wsdl можно запустить и удаленно:
wsdl http://www.webservicex.net/globalweather.asmx?wsdl
В созданном файле объявлен класс GlobalWeather, наследник System.Web.Services.Protocols.SoapHttpClientProtocol. Функции этого класса предназначены как для синхронного, так и для асинхронного вызова. Например, синхронная функция GetWeather запрашивает строковые параметры с названием города и страны и возвращает строку с XML-документом. В сервисе есть и другая функция, с помощью которой можно узнать доступные города для каждой страны:
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http:/ /www.webserviceX.NET/GetWeather", RequestNamespace="http://www.webserviceX.NET", ResponseNamespace="http://www.webserviceX.NET", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wr apped)] public string GetWeather(string CityName, string CountryName) { object[] results = this.Invoke("GetWeather", new object[] { CityName, CountryName}); return ((string)(results[0])); }
Это текст можно использовать на странице:
<form id="form1" runat="server"> <br /> <asp:Button ID="Button1" runat="server" Text="А теперь про- гноз погоды" OnClick="Button1_Click" /> <br /> <br /> <asp:Label ID="lblTemp" runat="server" Text="Температура в Москве "></asp:Label> </form>
protected void Button1_Click(object sender, EventArgs e) { // создание экземпляра прокси-класса GlobalWeather gw = new GlobalWeather(); // запрос функции web-сервиса string xmlstring = gw.GetWeather("Moscow", "Russia"); XmlDocument doc = new XmlDocument(); // загрузка ответа в документ doc.LoadXml(xmlstring); // doc.ChildNodes.Item(0) — это XML-заголовок // doc.ChildNodes.Item(1) — тело XmlNode child = doc.ChildNodes.Item(1); XmlElement el = child["Temperature"]; lblTemp.Text += el.InnerText; }