Опубликован: 14.11.2006 | Уровень: для всех | Доступ: платный
Лекция 16:

Web-сервисы

< Лекция 15 || Лекция 16: 1234 || Лекция 17 >

Пользование 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. Появится диалоговое окно.

Введите 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 Description 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;
  }
< Лекция 15 || Лекция 16: 1234 || Лекция 17 >
Алексей Савельев
Алексей Савельев

https://technet.microsoft.com/en-us/library/ms143221(v=sql.105).aspx

Денис Прокофьев
Денис Прокофьев

Везде написано, что это самый независимый и простой в использовании навигационный элемент управления, что он работает сразу с web.sitemap и не требует определения SiteMapDataSource.

Моя карта сайта состоит из двух страниц, вложенных друг в друга. asp:Menu, asp:TreeView отбображаются как ожидалось, а вот asp:SiteMapPath - нет. Он не виден нигде. Однако на его месте формируется разметка: <span id="SiteMapPath1"><a href="#SiteMapPath1_SkipLink" style="position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden;">Проход по ссылкам навигации</a><a id="SiteMapPath1_SkipLink"></a></span> - т.е. элемент отрабатывает.

В словах xHTML это выглядит так: <asp:SiteMapPath ID="SiteMapPath1" runat="server" />. Причем не важно - внутри тега form или снаружи - всегда одинаково.

Т.к. другие нав. ЭУ работают через простой источник данных без ошибок, делаю вывод - карта составлена правильно. ИД: <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" />

Карта: <?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
  <siteMapNode url="~/L11_1_simplePage.aspx" title="Страница 1"  description="Простая страница 1." >
    <siteMapNode url="~/L11_1SimplePage2.aspx" title="Страница 2"  description="Простая страница 2" />
  </siteMapNode>
</siteMap>

Почему так происходит? Вроде делаю все по примерам. VS Community 2015. NetFramework в проекте: v4.0.30319

Зарина Каримова
Зарина Каримова
Казахстан, Алматы, Гимназия им. Ахмета Байтурсынова №139, 2008
Akiyev Begench
Akiyev Begench
Беларусь, Полоцк, полоцкий государственный университет