Опубликован: 12.02.2013 | Доступ: свободный | Студентов: 785 / 44 | Длительность: 17:51:00
Специальности: Программист
Самостоятельная работа 12:

Использование сетевых ресурсов в приложении

< Лекция 7 || Самостоятельная работа 12 || Лекция 8 >
Аннотация: Цель работы: изучение возможностей создания служб WCF и их использования в приложениях для Windows Phone.

Основные теоретические сведения

Приложения для Windows Phone могут взаимодействовать с веб-серверами, используя протоколы Интернета. Также можно создавать сетевые службы и использовать их в устройствах Windows Phone.

Службы Windows Communication Foundation, или WCF, предоставляют возможность процессам взаимодействовать друг с другом по сети. Процессы могут обмениваться сообщениями по сети, используя различные сетевые среды. Службы работают на сервере, к которому могут получать доступ клиентcкие программы. В нашем случае клиентская программа будет работать в Windows Phone.

На рисунке представлен принцип взаимодействия программы с сетевой службой. Программное обеспечение телефона взаимодействует с прокси-объектом, который содержит методы, предоставляемые службой. Вызов метода прокси-объекта приводит к созданию и оправке сетевого сообщения службе на сервере. При получении сообщения сервер вызывает код метода серверного объекта. Результат, возвращаемый методом, упаковывается в другое сетевое сообщение, которое отправляется клиенту, который пересылает возвращаемое значение программе, которая вызвала этот метод. При этом, система выполняет всю работу по созданию и передаче сообщений. Необходимо только создать серверные методы и вызывать их на клиентской системе.

Взаимодействие программы для Windows Phone с сетевой службой

Рис. 18.1. Взаимодействие программы для 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, в котором можно вызвать метод службы с различными параметрами и просмотреть результаты, которые метод возвращает.

Окно программы Тестовый клиент WCF

Рис. 18.2. Окно программы Тестовый клиент 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 необходимо обрабатывать исключения в блоке trycatch и выдавать пользователю сообщение о недоступности сети.

Приложение при необходимости может взаимодействовать сразу с несколькими удалёнными службами. В этом случае для каждой службы добавляются ссылки в проект приложения, и работа с ними организуется точно таким же образом, что и в рассмотренном примере.

Дополнительные материалы

Сайт MSDN: http://msdn.microsoft.com/ru-ru/library/bb907578.

Задание к работе

  1. Создайте в Visual Studio проект службы WCF, которая предоставляет 2—3 метода, и запустите её.
  2. Создайте в Visual Studio проект программы Silverlight для Windows Phone для вызова методов службы и вывода на экран полученных результатов.
  3. Запустите программу и проверьте правильность её работы.
  4. Составьте отчёт о проделанной работе. Включите в отчёт необходимые листинги программы и службы.
< Лекция 7 || Самостоятельная работа 12 || Лекция 8 >