Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #93, СЕНТЯБРЬ 2006 г.

веб-сервиз для КПК

Тарасов Дмитрий aka Dem@n

Хакер, номер #093, стр. 093-142-3


Для того чтобы мы могли получать доступ к этим данным, ребята из ЦБ написали веб-сервис, позволяющий нам уже из своего кода вызывать методы, которые описаны на сервере и служат для получения и обработки этой информации. Чтобы начать работу, нужно добавить референс на веб-службу:

http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx

Если откроешь эту ссылку в браузере, то увидишь описание методов некоего класса DailyInfo. Этот документ автоматически был сгенерирован, когда программисты ЦБ скомпилировали и запустили веб-службу на сервере. Описание содержит тип возвращаемых данных и назначение конкретного метода.

При добавлении референса в проект среда автоматически генерирует прокси-класс DailyInfo(), с которым мы и будем работать. Также необходимо подключить пространство имен:

using cbrf.ru.cbr.www; //здесь cbrf – название нашего проекта

Теперь можно использовать DailyInfo как обычный локальный класс:

DailyInfo di = new DailyInfo(); //создаем экземпляр прокси-класса

Пишем код

После изучения методов, предоставляемых нам классом DailyInfo() для доступа к необходимой инфе, приступим к непосредственно разработке.

Создаем новый C# - проект типа «Smart Device Application», платформу - Pocket PC, тип приложения - Windows Application.

Разместим на форме две закладки, на одной из которых будет инфа о курсах, на другой — об их динамике. Для отображения данных нам понадобится два контрола DataGrid. Добавим также меню «Загрузка» с пунктами «Курсы валют» и «Динамика курсов». Остальные возможности к проге добавишь сам :). Для получения соответствующих данных используются следующие методы:

GetCursOnDate - метод, возвращающий DataSet с текущими курсами валют. Принимает в качестве параметра текущую дату.

GetCursDynamic - метод, возвращающий DataSet с динамикой курса какой-то конкретной валюте. Принимает в качестве параметров дату начала и конца изменения курса, а также код валюты.

При выборе действия в меню будем вызывать функцию LoadingData, код который можно посмотреть ниже.

Код функции LoadingData

private void LoadingData(DataGrid Target, int ServiceNumber)

{

tableStyle.GridColumnStyles.Clear();

dgValuta.TableStyles.Clear();

if (ServiceNumber == 1)

{

tbPages.SelectedIndex=0; //показываем первую закладку

handle = di.BeginGetCursOnDate(DateTime.Now,null,null); //начинаем асинхронный вызов метода

}

if (ServiceNumber==2)

{

tbPages.SelectedIndex=1;

handle=di.BeginGetCursDynamic(DateTime.Parse(textBox1.Text),DateTime.Parse(textBox2.Text),"R01235",null,null); //начинаем асинхронный вызов метода

}

}

Само собой, неплохо бы привести этот код в блоке try и отлавливать исключения. Журнал не резиновый, поэтому останавливаться на этом не будем.

Как видишь, все элементарно, но есть один любопытный нюанс. Независимо от того, каким образом твой наладонник подключен к интернету, время ожидания данных будет вполне ощутимо. Поэтому если ты не хочешь при нажатии кнопки «Загрузить» некоторое время лицезреть нереагирующую на действия пользователя прогу с «подвисшим» интерфейсом, то рекомендую использовать асинхронный вызов службы. Суть его в том, что обмен данными между сервером и КПК осуществляется как бы в отдельном потоке, предоставляя приложению возможность обрабатывать другие события. Реализуется же это за счет использования методов BeginGetCursOnDate и BeginGetCursDynamic вместо GetCursOnDate и GetCursDynamic. Для того чтобы проверить, закончена ли загрузка данных, используется свойство Handle.IsCompleted. Когда оно принимает значение true, данные можно обрабатывать и отображать. Я прицепил к форме таймер и каждую секунду тупо проверял значение этого свойства.

Назад на стр. 093-142-2  Содержание  Вперед на стр. 093-142-4