веб-сервиз для КПК Тарасов Дмитрий 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, данные можно обрабатывать и отображать. Я прицепил к форме таймер и каждую секунду тупо проверял значение этого свойства. |