Использование сетевых ресурсов в приложении
Основные теоретические сведения
Приложения для Windows Phone могут взаимодействовать с веб-серверами, используя протоколы Интернета. Также можно создавать сетевые службы и использовать их в устройствах Windows Phone.
Службы Windows Communication Foundation, или WCF, предоставляют возможность процессам взаимодействовать друг с другом по сети. Процессы могут обмениваться сообщениями по сети, используя различные сетевые среды. Службы работают на сервере, к которому могут получать доступ клиентcкие программы. В нашем случае клиентская программа будет работать в Windows Phone.
На рисунке представлен принцип взаимодействия программы с сетевой службой. Программное обеспечение телефона взаимодействует с прокси-объектом, который содержит методы, предоставляемые службой. Вызов метода прокси-объекта приводит к созданию и оправке сетевого сообщения службе на сервере. При получении сообщения сервер вызывает код метода серверного объекта. Результат, возвращаемый методом, упаковывается в другое сетевое сообщение, которое отправляется клиенту, который пересылает возвращаемое значение программе, которая вызвала этот метод. При этом, система выполняет всю работу по созданию и передаче сообщений. Необходимо только создать серверные методы и вызывать их на клиентской системе.
Также служба предоставляет описание её методов. Это описание использует среда разработки (в нашем случае — Visual Studio) для создания прокси-объекта в клиентской программе. Это упрощает создание клиентского приложения.
Рассмотрим пример создания службы Новость дня, которая будет возвращать одну из новостей по запросу клиента. Клиент должен передать в качестве параметра цифру 1, 2 или 3, которая, для удобства, будет обозначать категорию новостей.
Приложение будет состоять из двух частей: программа на сервере, которая экспортирует службу, и программа на клиенте, которая её использует. Сервер будет службой WCF, а клиент — приложением для Windows Phone, которое подключается к службе и запрашивает новость.
Для создания службы WCF нужно при создании проекта Visual Studio выбрать шаблон Приложение службы WCF в группе WCF. Службу можно тестировать в среде Visual Studio. После тестирования файлы проекта можно будет загрузить на рабочий сервер. Обратите внимание, что службу можно создать в Visual Web Developer 2010 Express.
Службы и клиенты похожи на методы. При создании сервера создаётся метод, который выполняет какие-то действия и возвращает результат. Клиента вызывает метод сервера и обрабатывает результат. При этом, служба WCF выполняет все необходимые действия по упаковке параметров и возвращаемого значения метода в сетевые сообщения. При создании проекта службы в файле .cs создаётся интерфейс, который определяет предоставляемый службой метод:
[ServiceContract] public interface INewsOfTheDayService { [OperationContract] string GetData(int value); }
В общем случае, служба может предоставить несколько методов, но в нашем примере достаточно одного метода. Этот метод принимает один параметр и возвращает результат. Также при создании службы будут автоматически созданы метод GetDataUsingDataContract и класс CompositeType, которые являются примерами использования сложных типов данных в службах, и их можно удалить.
После создания интерфейса можно создать код метода, который будет предоставлять служба. Заготовка метода создаётся по умолчанию в файле службы с расширением .svc, с которым связан одноимённый файл .cs. Атрибуты [ServiceContract] и [OperationContract] предоставляют средства для создания описания службы при построении проекта, которые будут использоваться клиентами для взаимодействия с этими службами.
public class NewsOfTheDayService : INewsOfTheDayService { public string GetData(int value) { string result; switch (value) { // категория "Компьютеры" case 1: result = "Intel Xeon E5-2600: "облачные" процессоры ставят рекорды"; break; // категория "Программное обеспечение" case 2: result = "Вышла в свет ОС Windows 8 Consumer Preview"; break; // категория "Мобильные устройства" case 3: result = "Nokia выпускает новые телефоны с ОС Windows Phone 7.5 Mango"; break; // если указан неверный номер категории default: result = "Выбрана несуществующая категория"; break; } return result; } }
Этот метод возвращает строку с новостью в соответствии с запрошенной категорией. Если будет передан номер несуществующей категории, будет выдано сообщение об ошибке.
Если попытаться запустить проект, Visual Studio создаст веб-сервер, на котором будет запущена служба, и откроется окно программы Тестовый клиент WCF, в котором можно вызвать метод службы с различными параметрами и просмотреть результаты, которые метод возвращает.
Создание клиентского приложения
Для того чтобы создать приложение Windows Phone, которое будет работать с созданной службой, нужно создать новый проект. Клиентское приложение должно подключаться к службе NewsOfTheDayService. Ссылка на службу добавляется в проект так же, как и ссылка на ресурс, только в контекстном меню в окне обозревателя решений нужно выбрать пункт Добавить ссылку на службу…. Откроется диалоговое окно Добавить ссылку на службу, в котором нужно указать URL запущенной службы. Visual Studio найдёт описание службы и все предоставляемые ею методы. Также можно изменить пространство имён по умолчанию, которое будет использоваться в создаваемом приложении, на NewsOfTheDayService.
После добавления ссылки на службу её можно использовать в решении. Теперь необходимо создать прокси-объект, который будет использоваться для вызова методов службы. Лучше сделать это в конструкторе главной страницы приложения:
NewsOfTheDayService.NewsOfTheDayServiceClient newsclient; // Конструктор public MainPage() { InitializeComponent(); newsclient = new NewsOfTheDayService.NewsOfTheDayServiceClient(); newsclient.GetDataCompleted += new EventHandler<NewsOfTheDayService.GetDataCompletedEventArgs> (newsclient_GetDataCompleted); }
Этот код создаёт прокси-объект для службы и связывает метод-обработчик с событием GetDataCompleted, которое происходит при получении ответа от службы. Вызов метода службы выполняется асинхронно. Метод-обработчик должен выводить на экран полученную новость:
void newsclient_GetDataCompleted(object sender, NewsOfTheDayService.GetDataCompletedEventArgs e) { if (!e.Cancelled) { newsTextBlock.Text = e.Result; } }
Этот метод проверяет, успешно ли завершился вызов метода службы, и если да, то выводит полученный результат экран.
После этого необходимо создать обработчик события нажатия на кнопку, в котором будет вызываться метод WCF для обращения к серверу:
private void getNewsButton_Click(object sender, RoutedEventArgs e) { int category = 0; if (int.TryParse(newsTextBox.Text, out category)) { newsclient.GetDataAsync(category); } }
Этот метод получает номер категории новости и передаёт его в качестве параметра при вызове метода GetDataAsync. Если текст в поле newsTextBox не может быть преобразован в целое число, метод TryParse вернёт значение false.
Если служба будет недоступна, при вызове метода GetDataAsync будет сгенерировано исключение. Это может произойти, если во время выполнения программы в телефоне сигнал сети не будет доступен. В приложениях для Windows Phone необходимо обрабатывать исключения в блоке try—catch и выдавать пользователю сообщение о недоступности сети.
Приложение при необходимости может взаимодействовать сразу с несколькими удалёнными службами. В этом случае для каждой службы добавляются ссылки в проект приложения, и работа с ними организуется точно таким же образом, что и в рассмотренном примере.
Дополнительные материалы
Сайт MSDN: http://msdn.microsoft.com/ru-ru/library/bb907578.
Задание к работе
- Создайте в Visual Studio проект службы WCF, которая предоставляет 2—3 метода, и запустите её.
- Создайте в Visual Studio проект программы Silverlight для Windows Phone для вызова методов службы и вывода на экран полученных результатов.
- Запустите программу и проверьте правильность её работы.
- Составьте отчёт о проделанной работе. Включите в отчёт необходимые листинги программы и службы.