Файл: Справочник для опытных и как пособие для начинающих программистов. Компактдиск содержит исходные коды примеров из книги.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, укажем имя NameWebКлиентПогода. К текущему проекту добавим 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 Ex­plorer появится ссылка на удаленный класс: 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).