Опубликован: 02.08.2013 | Доступ: свободный | Студентов: 468 / 15 | Длительность: 18:38:00
Специальности: Программист
Самостоятельная работа 8:

Работа webClient и HttpWebRequest

В Листинге 29.3 приведен код файла MainPage.xaml, здесь опущены некоторые комментарии, некоторые комментарии переведены для лучшего понимания структуры проекта.

using Microsoft.Phone.Controls;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Xml.Linq;

namespace RSSReaderWindowsPhone
{
    public partial class MainPage : PhoneApplicationPage
    {
        // Constructor
        public MainPage()
        {
            InitializeComponent();

            this.Loaded += new RoutedEventHandler(MainPage_Loaded);

        }

        private void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
            // В этом обработчике события нам нужно создать webClient, который загрузит данные по заданной ссылке 
            WebClient wc = new WebClient();
            wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler(wc_DownloadStringCompleted);
            // Ссылка на ленту
            wc.DownloadStringAsync(new Uri("http://www.mosaiquefm.net/Syndicate/MosaNews.xml"));
        }

        private void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
        {
            //В ходе этой простой проверки будет осуществлен возврат из обработчика если устройство не подключено к сети
            if (e.Error != null)
                return;
            XElement xmlitems = XElement.Parse(e.Result);
            // Создаем список элементов
            List<XElement> elements = xmlitems.Descendants("item").ToList();

            //Разместим полученную информацию в XAML-элементе управления ListBox
            List<RSSItem> aux = new List<RSSItem>();
            foreach (XElement rssItem in elements)
            {
                RSSItem rss = new RSSItem();
                
                rss.Description1 = rssItem.Element("description").Value;
                rss.Link1 = rssItem.Element("link").Value;
                rss.Title1 = rssItem.Element("title").Value;
                aux.Add(rss);

                TextBlock tbTitle = new TextBlock();
                tbTitle.Text = rss.Title1 + "\n";
                ListBoxRss.Items.Add(tbTitle);

                TextBlock tbDescription = new TextBlock();
                tbDescription.Text = rss.Description1 + "\n";
                ListBoxRss.Items.Add(tbDescription);

            }
        }
    }
}
Листинг 29.3. Код страницы MainPage.xaml.cs

В конструкторе MainPage мы подписываемся на событие страницы Loaded, которое вызывается при добавлении её объекта в дерево объектов. В обработчике события MainPage_Loaded создаётся новый экземпляр объекта типа WebClient. После того, как этот объект создан, мы должны выполнить некоторые его настройки. В частности, задать обработчик события DownloadStringCompleted. Этот обработчик вызывается после завершения загрузки данных из Интернета. Подобные операции способны занимать достаточно много времени, что зависит от скорости сетевого соединения и объема данных, поэтому они выполняются асинхронно, когда они завершаются, вызывается соответствующий обработчик.

Операцию загрузки инициируем вызовом метода DownloadStringAsync с указанием URI ресурса, в данном случае это – адрес RSS-канала.

Загрузка занимает некоторое время, в это время в интерфейсе приложения ничего не выводится, когда же происходит вызов обработчика события завершения загрузки, wc_DownloadStringComplete, в этот обработчик передаётся аргумент e типа DownloadStringCompletedEventArgs, свойство которого Result, при удачном завершении операции, содержит данные, загруженные по заданному URI.

Данные приходят с веб-сервиса в виде текста в формате XML. Для того чтобы работать с подобными данными, нужно произвести их предварительную подготовку. Такая подготовка выполняется в два этапа. Сначала создаётся объект xmlitems типа XElement (System.Xml.Linq.XElement), в него, с помощью статического метода Parse класса XElement, загружаются XML-данные из строки, которая имеется в свойстве e.Result.

После этого осуществляется построение списка типа XElement на основе элемента xmlitems. Из XML-кода, содержащегося в элементе, выбираются элементы, имя которых соответствуют заданному. В данном случае это – item. Элементы попадают в список.

На следующем шаге создаётся список типа RSSItem – этот тип определен в рассматриваемом приложении, осуществляется заполнение списка, ListBoxRSS, который расположен на MainPage.xaml и применяется для вывода списка сообщений.

Подобная схема работы характерна для WebClient. Её основные составные части выглядят следующим образом:

  1. Создать объект WebClient
  2. Оформить подписку на событие, которое соответствует завершению операции. При загрузке данных с веб-сервиса это DownloadStringCompleted, при отправке строковых данных – UploadStringCompleted, он поддерживает и другие события.
  3. Вызвать соответствующий метод (DownloadStringAsync, UploadStringAsync, или другие).
  4. Дождаться вызова обработчика события, на которое ранее была оформлена подписка, обработать результат, возвращённый после выполнения операции.