Опубликован: 02.08.2013 | Уровень: для всех | Доступ: платный
Самостоятельная работа 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. Дождаться вызова обработчика события, на которое ранее была оформлена подписка, обработать результат, возвращённый после выполнения операции.
Вася Пупкин
Вася Пупкин
Россия, с. Оймякон
антон Антонкин
антон Антонкин
Россия