Файл: Справочник для опытных и как пособие для начинающих программистов. Компактдиск содержит исходные коды примеров из книги.doc
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 11.01.2024
Просмотров: 925
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Глава 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
Moscow / Vnukovo , Russia (UUWW) 55-39N 037-16E
from the E (090 degrees) at 11 MPH (10 KT):0
1 mile(s):0
overcast
23 F (-5 C)
Windchill: 12 F (-11 C):l
23 F (-5 C)
100%
29.68 in. Hg (1005 hPa)
Success
Как видно из листинга, параметры погоды указываются в 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 = "Температура воздуха в Москве: " + Значение;
}
}
}
Рис. 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).
О 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 = "Температура воздуха в Москве: " + Значение;
}
}
}
Рис. 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).