лекция. Зиборов. Справочник для опытных и как пособие для начинающих программистов. Компактдиск содержит исходные коды примеров из книги
Скачать 7.39 Mb.
|
Глава 15 Создание Web-служб и их клиентов О Web-службах Web-служба (от англ. Webservice) — это программная система (более конкретно — откомпилированная библиотека динамической компоновки, т. е. файл формата DLL в папке bin приложения), расположенная на удаленном сервере (компьютере), к которой можно обращаться (потреблять сервис Web-службы) из своего клиентского компьютера. При этом возможности удаленной Web-службы будут реализованы в вашем Windows- или Web-приложении, а пользователь при достаточной скорости трафика может даже не заметить обращения вашей программы к удаленному серверу. На удаленном компьютере могут находиться и программный код, и данные. Для передачи по Интернету вызовов методов Web-служб и результатов их выполнения используется протокол SOAP (Simple Object Access Protocol). Протокол SOAP применяет формат сообщений, основанный на XML. Web-служба и протокол SOAP не зависят от конкретной платформы. Поэтому различные разработчики могут использовать Web-службы друг друга, не беспокоясь о совместимости операционных систем, технологий или языков программирования. Другое название Web-службы — Web-сервис. Web-службы решают очень разные задачи. Это прогноз погоды, гороскоп, переводчик слов на различные иностранные языки, курсы валют, котировки ценных бумаг, проверка на корректность введенного пользователем почтового адреса, реестр улиц города, статистика правонарушений, информация о наличии свободных мест на авиарейс или в кинотеатр и т. д. Причем любой из подобных сервисов вы можете легко встроить в свое Windows- или Web-приложение путем создания клиентского приложения, потребляющего такой уже существующий сервис Web-службы. Рис. 15.1. Пять методов Web-сервиса по операциям с курсами валют Для поиска Web-служб в Интернете существует несколько сайтов, в которых ; Web-службы регистрируются их провайдерами для того, чтобы их могли найти заинтересованные в них разработчики. Таким сайтом является, например: http://uddi.xml.org/uddi-org. Регистрация в каталоге UDDI бесплатна. Здесь, сегодня можно найти несколько десятков более или менее полезных Web-служб. В Сети можно найти и другие списки общедоступных Web-служб различных произво-ителей, например: http://www.xmethods.org/ve2/index.po. Список русскоязычных Web-служб можно найти по адресу: http://ivbeg.bestpersons.ru/feed/post3279396/. Упрощенно говоря, Web-служба в среде .NET состоит из двух компонентов: ASMХ-файла и файла программной поддержки ASMX.cs. ASMX-файл содержит в себе информацию о методах Web-службы, о способах их тестирования, это можно посмотреть в любом Web-браузере. Файл программной поддержки написан на языке Visual С#, может быть скомпилирован для получения библиотеки DLL. Именно с расширением dll обеспечивает реализацию методов Web-службы. Например, на рис. 15.1 показано отображение в браузере Internet Explorer методов Web-службы, представленной в Сети по адресу: http://webservice.webserviceshare.com/currencyconverter/rates.asmx. Здесь перечислены пять методов Web-службы по операциям с текущими курсами валют. В создаваемом разработчиком клиентском приложении необходимо сделать ссылку на данный Web-сервер и таким образом включить в текущий проект удаленный класс. А затем в своем программном коде объявить создание нового экземпляра этого класса, и теперь можно уже обращаться ко всем методам класса. Пример 110. Клиентское Web-приложение, потребляющее сервис Web-службы "Прогноз погоды" В данном разделе создадим клиентское Web-приложение, потребляющее сервис Web-службы сайта http://www.webservicex.net/globalweather.asmx и продемонстрируем тем самым, что это — просто! Данная Web-служба возвращает прогноз погоды в городе, который пользователь задает в запросе к службе. Эта Web-служба поддерживает два метода (функции): GetСitiesByСountry и GetWeather (Рис. 15.2). На вход первой функции GetСitiesByСountry подают название страны, гдехотят получить прогноз погоды, а на выходе функции получают перечисление городов этой страны, для которых Web-служба готова сделать прогноз погоды. Рис. 15.2. Два метода Web-службы прогноза погоды На вход второй функции GetWeather подают названия города и страны, а на выходе функции получают XML-строку, содержащую прогнозируемые параметры погоды (листинг 15.1). Листинг 15.1. XML-код, полученный из функции Getweatber 29.68 in. Hg (1005 hPa) Как видно из листинга, параметры погоды указываются в XML-элементах: температура (Temperature), относительная влажность (RelativeHumidity), давление (Pressure) и проч. в Москве 9 декабря 2010 года на 8:30 по Гринвичу. Напишем Web-приложение (также легко можно написать и Windows-приложение), обращающееся к функции GetWeather данной удаленной Web-службы. Причем программный код должен быть минимальным и демонстрировать лишь принцип подключения и доступ к нужному элементу (например, температуре) XML-документа. Для этой цели после запуска Visual Studio 2010 выберем проект шаблона Empty ASP.NET Web Application, укажем имя Name — WebКлиентПогода. К текущему проекту добавим Web-форму. Для этого в пункте меню Project выберем команду Add New Item и в появившемся окне дважды щелкнем на шаблоне Web Form. Далее, попав в конструктор Web-формы, из панели элементов Toolbox перетащим кнопку Button, текстовое поле TextBox для вывода строки с данными XML и метку Label для вывода на нее значения температуры. Теперь наступает ключевой момент, а именно — подключение ссылки на удаленную Web-службу, содержащую класс с необходимыми методами. Для этого в пункте меню Project выберем команду Add Web Reference. Этого пункта меню может не быть в меню Project, в этом случае выбираем Add Service Reference | Аdvanced | Add Web Reference. Также эту команду можно выбрать в контекстном меню окна Solution Explorer. В результате получим интерфейс, показанный на рис. 15.3. Здесь в поле URL введем адрес Web-службы: http://www.webservicex.net/ globalweather.asmx и щелкнем на кнопке Go. Рис. 15.3. Поиск нужной Web-службы в Сети Теперь в окне под полем URL мы увидим оба метода данного сервиса в том виде, как это было на рис. 15.2 (после нажатия на кнопку Go). При этом станет доступной кнопка Add Reference. Щелкнем на этой кнопке, после этого в окне Solution Explorer появится новый узел Web References со ссылкой на удаленный класс net.webservicex.www (рис. 15.4). Рис. 15.4. В окне Solution Explorer появилась ссылка на удаленный класс Теперь этот класс, содержащий необходимую нам удаленную Web-службу, мы можем использовать в своем программном коде (листинг 15.2). Листинг 15.2. Web-приложение, обращающееся к сервису удаленной Web-службы прогноза погоды // Web-приложение, потребляющее сервис удаленной Web-службы прогноза погоды. Приложение в текстовом // поле TextBox демонстрирует XML-строку с параметрами погоды для города, указанного во входных параметрах // при обращении к Web-службе. Также выводит в текстовую метку значение температуры в этом городе using System; using System.Web.Ul.WebControls; // Другие директивы using удалены, поскольку они не используются в данной программе namespace Пoroдa_Web { public partial class WebForm1 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { Button1.Text = "Выяснить погоду"; Label1.Text = string.Empty; TextBox1.TextMode = TextBoxMode.MultiLine; Button1.Focus(); } protected void Button1_Click(object sender, EventArgs e) { // Создаем клиентское приложение Web-службы: // http://www.webservicex.net/globalweather.asmx. // Эта Web-служба часто бывает перегужена и поэтому может выдать сообщение: "Server is too busy". // Создание экземпляра прокси-класса: var ПОГОДА = new net.webservicex.www.GlobalWeather(); // Эти три строчки - для отладки, чтобы лишний раз не "дергать" сервер: // var Reader = new System.IO.StreamReader("С:\\Погода.xml"); // string Строка_ХМL = Reader.ReadToEnd() ; // Reader.Close(); // Функция GetWeather запрашивает строковые параметры с названием // города и страны и возвращает строку с XML-документом: string Строка_ХML = ПОГОДА.GetWeather("Moscow", "Russia"); // Какая погода в Киеве: // string Строка_ХМL = ПОГОДА.GetWeather("Kyiv", "Ukraine"); TextBox1.Text = Строка_ХМL; var Документ = new System.Xml.XmlDocument(); // Загрузка строки XML в XML-документ Документ. LoadXml (Строка_ХМL) ; var Читатель = new System.Xml.XmlNodeReader(Документ); string Имя = string.Empty; string Значение = string.Empty; while (Читатель.Read() == true) { // Читаем последовательно каждый узел, выясняя тип узла: if (Читатель.NodeType == System.Xml.XmlNodeType.Element) Имя = Читатель.Name; // Каждый раз запоминаем имя узла if (Читатель.NodeType != System.Xml.XmlNodeType.Text) continue; if (Имя == "Temperature") { Значение = Читатель.Value; break; } } // Выход из цикла, когда прочитали данные узла "Temperature" Label1.Text = "Температура воздуха в Москве: " + Значение; } } } Как видно, в программном коде при обработке события "щелчок на кнопке" Выяснить погоду создается экземпляр класса удаленной Web-службы. Далее происходит непосредственное обращение к методу класса GetWeather с входными параметрами город и страна, и метод GetWeather возвращает строку с XML-документом. Данную строку выводим в текстовое поле TextBox1. Для "расшифровки" XML-строки загружаем эту строку в XML-документ. Значение температуры находим в содержимом элемента Temperature, затем выводим значение температуры на метку Label1. Фрагмент работы программы показан на рис. 15.5. Рис. 15.5. Работа клиента Web-службы "Прогноз погоды" Можно было бы вывести содержимое XML-документа на сетку данных GridView, тогда мы могли бы увидеть все параметры погоды в удобной таблице. Мы не стали этого делать, чтобы не загромождать программу и тем самым не "затушевать" главную идею, а именно обращение к удаленному классу, предоставленному Web-службой. Таким образом, мы продемонстрировали создание клиентского Web-приложения, потребляющего сервис Web-службы. Замечу, что аналогичным образом можно создавать и Windows-приложения (настольные приложения), которые также, будучи клиентами какой-либо Web-службы, могут получать, например, справочную информацию в онлайновом режиме. Убедиться в работоспособности данной программы можно, открыв соответствующий файл решения в папке WebKлиeнтПoгoдa. Пример 111. Клиентское Windows-приложение, использующее Web-службу "Прогноз погоды" Теперь создадим клиентское Windows-приложение, потребляющее сервис той же Web-службы "Прогноз погоды", и продемонстрируем тем самым, что обращаться к удаленному классу можно не только из Web-приложения, но и из Windows-приложения (т. е. из настольного приложения). Для решения этой задачи запустим Visual Studio 2010, выберем шаблон Windows Forms Application С#. В поле Name зададим имя WindowsKлиентПогодa. В конструкторе формы добавим кнопку Button, текстовое поле TextBox и метку Label. Следующим этапом разработки клиентского приложения является добавление ссылки на удаленный класс искомой Web-службы. Для этого выберем в пункте меню Project команду Add Service Reference, это приведет к появлению диалогового окна Add Service Reference. В этом окне щелкнем кнопку Advanced, а затем кнопку Add Web Reference. В появившемся диалоговом окне Add Web Reference в поле URL введем адрес Web-службы: http://www.webservicex.net/globalweather.asmx и нажмем кнопку Go. В окне ниже увидим список доступных методов данного сервиса, после этого щелкнем на кнопке Add Reference. При этом в окне Solution Explorer появится ссылка на удаленный класс: net.webservicex.www. Теперь мы можем использовать эту ссылку в программном коде (листинг 15.3). Листинг 15.3. Windows-приложение, использующее сервис удаленной Web-службы прогноза погоды // Windows-приложение, потребляющее сервис удаленной Web-службы прогноза погоды. Приложение в текстовом //поле TextBox демонстрирует XML-строку с параметрами погоды для города, указанного во входных параметрах // при обращении к Web-службе. Также выводит в текстовую метку значение температуры в этом городе using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; // Другие директивы using удалены, поскольку они не используются в данной программе namespace WebКлиентПогода { public partial class Form1:Form { public Form1() { InitializeComponent(); // Добавляем внешнюю ссылку на Web-службу таким образом: // Проект - Добавить ссылку на службу - Дополнительно - // Добавить веб-ссылку http://www.webservicex.net/globalweather.asm Button1.Text = "Выяснить погоду"; label1.Text = string.Empty; textBox1.Multiline = true; button1.Focus(); } private void button1_Click(object sender, EventArgs e) { // Создание экземпляра прокси-класса: var ПОГОДА = new net.webservicex.www.GlobalWeather(); // Эти три строчки - для отладки, чтобы лишний раз не "дергать" сервер: //var Reader = new System.IO.StreamReader("С:\\Погода.xml"); //string Строка_ХМL = Reader.ReadToEnd(); //Reader.Close(); // Функция GetWeather запрашивает строковые параметры с названием // города и страны и возвращает строку с XML-документом: string Cтрока_XML =. ПОГОДА.GetWeather("Moscow", "Russia"); // Какая погода в Киеве: // string Cтрока_XML = ПОГОДА.GetWeather("Kyiv", "Ukraine"); textBox1.Text = Строка_ХМL; // Здесь считывание значения узла из XML-строки выполено более эффективно: var ХМL_элемент = System.Xml.Linq.XElement.Parse(Cтрока_XML); string Значение = ХМL_элемент.Element("Temperature").Value; label1.Text = "Температура воздуха в Москве: " + Значение; } } } |