лекция. Зиборов. Справочник для опытных и как пособие для начинающих программистов. Компактдиск содержит исходные коды примеров из книги
Скачать 7.39 Mb.
|
Рис. 15.6. Работа Windows-клиента Web-службы "Прогноз погоды" В программном коде при обработке события "щелчок на кнопке" button1 создаем экземпляр удаленного класса погода, а затем обращаемся к методу класса GetWeather, подавая на вход метода страну и город (Russia и Moscow), для которогс i хотим вяснить прогноз погоды. Этот метод возвращает строку XML. Эту XML строку мы выводим в текстовое поле textBox1, так же, как мы это делали в Web-приложении, однако извлекаем из узла Temperature прогнозируемое значение температуры более эффективным образом, используя методы технологии Linq. Фрагмент работы программы представлен на рис. 15.6. Убедиться в работоспособности программы можно, открыв решение в папке WindowsKлиентПогода. Пример 112. Создание простейшей Web-службы А теперь, когда мы убедились, что создать клиентское приложение, потребляющее сервис Web-службы, не сложно, поставим задачу создать самую простую Web-службу, чтобы убедиться, что это тоже простая задача. Автор понимает, что сейчас наступил очень деликатный момент: если сейчас будет приведен какой-либо сложный пример, то можно навсегда отбить интерес у читателя разобраться с принципами работы Web-служб. Поэтому задача, решаемая данной Web-службой, будет максимально простой. Например, пользователю предлагается ввести два числа, а Web-служба берет на себя функцию сложения этих двух чисел и вывода (возврата) суммы. При этом необходимо произвести диагностику вводимых данных. От такой Web-службы нет особенной пользы, но на этой маленькой задачке нам будет удобно продемонстрировать все возможности. Здесь, так же как и при отладке активных Web-страниц из предыдущей главы, при отладке данной Web-службы в качестве удаленного серверного компьютера и клиентского компьютера мы будем использовать один ваш локальный компьютер. Для решения этой задачи запустим Visual Studio 2010, выберем шаблон Empty ASP.NET Web Application, зададим имя, например, WebCлyжбaCyммa. Затем в меню Project выберем команду Add New Item, в появившемся окне укажем шаблон Web Service и щелкнем на кнопке Add. Сразу после этого попадаем на вкладку WebServicel.asmx.cs готовой Web-службы "Hello World", и уже ее можно тестировать. Содержимое этой вкладки приведено в листинге 15.4. Листинг 15.5. Создание простейшей Web-службы using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Services; namespace WebСлужбаСумма { /// /// Summary description for WebServicе1 /// [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] //To allow this Web Service to be called from script, using ASP.NET AJAX, // uncomment the following line. // [System.Web.Script.Services.ScriptService] public class WebService1 : System.Web.Services.WebService { [WebMethod] public string HelloWorld() { return "Hello World"; } } } Однако "HelloWorld — это другая задача, разработчики Visual Studio 2010 включили ее для облегчения программистам освоения данной технологии. Нас интересует именно наша задача, поэтому изменим файл программной поддержки, как показано в листинге 15.5. Листинг 15.5. Простейшая Web-служба / / На входе данной Web-службы предлагается ввести два числа, а Web-служба берет на себя функцию сложения //этих двух чисел и вывода (возврата) суммы. При этом Web-служба производит диагностику вводимых данных using System; . using System.Web.Services; Другие директивы using удалены, поскольку они не используются в данной программе namespace WebApplication1 { /// /// Summary description for WebService1 /// [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.Toolboxltem(false) ] // To allow this Web Service to be called from script, using ASP.NET AJAX, // uncomment the following line. // [System.Web.Script.Services.ScriptService] public class WebService1 : System.Web.Services.WebService { [WebMethod] public string Сумма(string Число1, string Число2) { // Входные параметры объявляем типа string, чтобы принимать // от пользователя любые символы, анализировать их и при // "плохом вводе" сообщать по-русски. Single X, Y; bool Число_ли = Single.TryParse( Число1, System.Globalization.NumberStyles.Number, System.Globalization.NumberFormatlnfо.Currentlnfo, out X); if (Число_ли == false) return "В первом поле должно быть число"; Число_ли = Single.TryParse(Число2, System.Globalization.NumberStyles.Number, System.Globalization.NumberFormatlnfo.Currentlnfо, out Y) ; if (Число_ли == false) return "Во втором поле должно быть число"; Single Z = X + Y; return "Сумма = " + Z.ToString(); } } } Как видно из текста программы, мы не программировали никакой пользовательский интерфейс. У нас здесь нет ни формы, ни кнопок, ни текстовых полей. Уже отсюда понятно, что Web-служба — это удаленный класс, к которому можно подключиться через Интернет из своего, например, Windows- или Web-приложения. На вход функции сумма пользователь Web-службы подает два числа, которые принимаются функцией как две строки. Функция Single.TryParse проверяет, числовые ли символы содержатся во введенных строках, и если это так, то происходит преобразование строковых переменных в переменные типа Single. Теперь можем протестировать данную Web-службу, для этого нажмем клавишу <F5>. При этом Web-браузер откроет ASMX-файл. Здесь мы увидим единственный метод этой Web-службы — сумма. Щелчок указателем мыши на этой гиперссылке обеспечит возможность тестирования нашей Web-службы (рис. 15.7). Мы можем вводить в данные поля нечисловые символы, числа с десятичной точкой или запятой и тем самым тестировать поведение нашей программы. Заметьте, что мы не программировали эти поля, система сама предоставила нам такую возможность для тестирования программируемой нами Web-службы. Убедиться в работоспособности данной Web-службы можно, открыв в папке WebСлужбаСумма соответствующий файл решения. Рис. 15.7. Тестирование созданной Web-службы Пример 113. Создание Windows-приложения — потребителя сервиса Web-службы Теперь напишем Windows-приложение (т. е. создадим ехе-файл), который будет обращаться к Web-службе, написанной в предыдущем разделе. Такое приложение можно называть клиентским. Для этого запустим Visual Studio 2010, выберем шаблон Windows Forms Application С# (можно даже Console Application), укажем имя проекта WebКлиентСумма. Из панели Toolbox перенесем в форму командную кнопку Button. Запланируем, что вся работа с удаленной Web-службой будет происходить при обработке события "щелчок на кнопке" Пуск. Чтобы сделать Windows-приложение потребителем сервиса Web-службы, необходимо в его проекте создать Web-ссылку на удаленный класс. Для этого выберем в пункте меню Project (или в контекстном меню окна Solution Explorer) команду Add Service Reference, это приведет к появлению диалогового окна Add Service Reference. В этом окне нажмем кнопку Advanced, а затем в следующем кне кнопку Add Web Reference. Поскольку мы отлаживаем и Web-службу, и его клиентское приложение на одном локальном компьютере, в поле URL пишем виртуальный адрес ASMX-файла. Этот адрес мы можем получить, запустив нашу Web-службу из предыдущего раздела, а затем скопировав в буфер обмена его URL-адрес. Для локального компьютера, на котором автор отлаживал данный пример, URL-адрес был таким: http://Iocalhost: 1611/Servicel .asmx. Затем нажмем кнопку Go и тем самым получим доступ к кнопке Add Reference, после щелчка на которой в окне Solution Explorer добавится значок ссылки на класс localhost, обеспечивающий доступ к Web-службе (рис. 15.8). Рис. 15.8. Добавление ссылки на класс localhost Если посмотреть на этот класс через браузер объектов View in Object Browser (используя контекстное меню в окне Solution Explorer), то можно увидеть все свойства, методы и события, которые содержатся в этом классе. Теперь, когда в наш проект добавлена ссылка на удаленный класс, мы можем вызывать методы этого класса в нашей программе (листинг 15.6). Листинг 15.6. Windows-приложение, потребляющее сервис Web-службы // Клиентское Windows-приложение, потребляющее сервис Web-службы предыдущего примера WebСлужбаСумма using System; using System.Windows.Forms; // Другие директивы using удалены, поскольку они не используются в данной программе namespace WebKлиентСумма { public partial class Form1:Form { public Form1() { InitializeComponent(); Button1.Text = "Пуск"; } private void button1_Click(object sender, EventArgs e) { // Чтобы добавить Web-службу к обычному Windows-приложению: // Project | Add Service Reference | Advanced | Add Web Reference, // затем в поле URL пишем виртуальный адрес Web-службы // http://localhost:1611/Servicel.asmx. // Создаем экземпляр удаленного класса: var Удаленный = new localhost.WebService1(); string Sum = Удаленный.Сумма("23,5", "11,4"); MessageBox.Show(Sum); } } } Как видно из программного кода, при обработке события "щелчок мышью" на кнопке Пуск создаем экземпляр удаленного класса и обращаемся к его функции (методу) сумма. При этом при вводе чисел специально одно из них пишем через десятичную точку, а другое — через запятую для тестирования возможности ввода чисел обоими способами. Результат работы программы представлен на рис. 15.9. Рис. 15.9. Обращение Windows-приложения к Web-службе Убедиться в работоспособности программы можно, открыв соответствующий sln-файл решения в папке WebКлиентСумма. Пример 114. Web-служба "Торговая рекомендация на рынке Forex" Создадим Web-службу, обеспечивающую торговой рекомендацией участников международного валютного рынка Forex. Как известно, любой желающий через Интернет, используя соответствующее программное обеспечение, может подключиться к этому рынку и совершить либо покупку какой-либо валютной пары (например, евро-доллар, EUR/USD), либо ее продажу. И в зависимости от правильно выбранного направления движения цены либо получить прибыль, либо убыток. Существует множество сайтов, где выкладываются рекомендуемые торговые стратегии работы на рынке Forex на текущую европейскую или американскую сессию. Иапример, мы доверяем какому-нибудь из таких сайтов, скажем, сайту http://www.forex-rdc.ru/subscribers.php?action=prognoz, и решаем руководствоваться его рекомендациями. Кроме того, мы создаем Web-службу, которая с помощью синтаксического разбора указанной выше Web-страницы будет извлекать торговую стратегию, рекомендованную данным сайтом на текущий день. Поскольку в нашей книге мы должны привести очень краткий и выразительный пример, то ограничимся торговой рекомендацией только для одной валютной пары EUR/USD. Для решения этой задачи запутим Visual Studio 2010, выберем шаблон ASP.NET Empty Web Application С#, зададим имя — WebСлуж6aForex. Далее в пункте меню Project выберем пункт Add New Item и в появившемся окне дважды щелкнем на шаблоне Web Service. Мы получим простейшую Web-службу "Hello World". Однако мы ее изменим согласно условию нашей задачи. Содержимое файлa программной поддержки приведено в листинге 15.7. Листинг 15.7. Web-служба "Торговая рекомендация на рынке Forex" // Web-служба, которая с помощью синтаксического разбора Web-страницы // http://www.forex-rdc.ru/subscribers.php?action=prognoz // извлекает торговую рекомендацию на рынке Forex для валютной пары EUR/USD, предлагаемую данным сайтом // на текущий день, и выводит ее потребителю сервиса Web-службы в виде строки using System; using System.Web.Services; // Другие директивы using удалены, поскольку они не используются в данной программе namespace WebCлуж6aForex { /// /// Summary description for WebService1 /// [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.Toolboxltem(false)] //To allow this Web Service to be called from script, using ASP.NET AJAX, // uncomment the following line. // [System.Web.Script.Services.ScriptService] public class WebService1: System.Web.Services.WebService { [WebMethod] public string Рекомендация() { // Создаем объект для чтения Web-страницы: var КЛИЕНТ = new System.Net.WebClient(); // Чтобы русские буквы читались корректно, объявляем объект Кодировка: var Кодировка = System.Text.Encoding.GetEncoding(1251); System.IO.Stream ПОТОК; string СТРОКА; try { // Попытка открытия Web-ресурса: ПОТОК = КЛИЕНТ.OpenRead( "http://www.forex-rdc.ru/subscribers.php?action=prognoz"); } catch (Exception Ситуация) { СТРОКА = string.Format("Ошибка открытия www.forex-rdc.ru\r\n{0)", Ситуация); return СТРОКА; } // Чтение HTML-разметки Web-страницы: var Читатель = new System.IO.StreamReader(ПОТОК, Кодировка); // Копируем HTML-разметку в строковую переменную: СТРОКА = Читатель.ReadToEnd(); // Ищем в разметке страницы фрагмент с указанной строкой: int i = СТРОКА.IndexOf("Торговая стратегия:"); // Ищем стратегию только для EUR/USD: СТРОКА = CTPOKA.Substring(i, 120); // Удаляем HTML-разметку: i = СТРОКА.IndexOf("р>"); СТРОКА = СТРОКА.Remove(i) ; СТРОКА = CTPOKA.Replace("", ""); // Вставляем текущую дату: СТРОКА = СТРОКА.Replace("стратегия:", "стратегия для EUR/USD на " + DateTime. Now. ToLongDateStr ing () + ":\r\ari"); ПОТОК.Close(); return СТРОКА; } } } Как видно из программного кода, данная Web-служба содержит в себе один метод Рекомендация (), который не имеет входных параметров. В начале метода создаем экземпляр класса WebClient для чтения и последующего синтаксического разбора Web-страницы. Вообще говоря, Web-страница может быть записана на машинном носителе в какой-либо кодировке. Чаще всего это Unicode (UTF-8), русскоязычные сайты часто имеют кодировку Windows 1251. Чтобы выяснить, в какой кодировке записана Web-страница, следует в браузере в контекстном меню навести указатель мыши на пункт меню Кодировка. При чтении Web-страницы создаем объект поток, используя URL-адрес страницы, и объект кодировка для корректного отображения кириллицы. После копирования HTML-разметки страницы в строковую переменную строка ищем в разметке страницы раздел с торговой стратегией для EUR/USD с помощью строковых операции. Теперь запустим созданную Web-службу, нажав клавишу <F5>. Если формальных ошибок нет, мы получим отображение ASMX-файла в браузере (рис. 15.10). |