Работа 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. Её основные составные части выглядят следующим образом:
- Создать объект WebClient
- Оформить подписку на событие, которое соответствует завершению операции. При загрузке данных с веб-сервиса это DownloadStringCompleted, при отправке строковых данных – UploadStringCompleted, он поддерживает и другие события.
- Вызвать соответствующий метод (DownloadStringAsync, UploadStringAsync, или другие).
- Дождаться вызова обработчика события, на которое ранее была оформлена подписка, обработать результат, возвращённый после выполнения операции.