Опубликован: 24.03.2009 | Доступ: свободный | Студентов: 2286 / 115 | Оценка: 4.24 / 3.93 | Длительность: 17:47:00
Лекция 10:

Создание взаимодействующих с сервером приложений в Silverlight

Использование SyndicatedFeed для организации доступа к RSS и ATOM

Двумя наиболее популярными типами данных, доступными в Интернете, являются каналы RSS и ATOM, обычно используемые в блогах или на новостных сайтах. Silverlight предлагает класс SyndicatedFeed (Информационный канал), с помощью которого можно без труда организовать доступ к этим данным.

SyndicatedFeed очень прост в использовании. Рассмотрим на примере. Но, прежде чем продолжить, остановимся на мгновение на междоменном доступе в Silverlight. При организации доступа к содержимому, находящемуся на других сайтах (не на том, который обслуживает содержимое Silverlight), .NET-классы ищут на сервере файл Crossdomain.xml. Если они находят его, то проводят синтаксический разбор междоменных правил, чтобы выяснить, имеют ли они право на доступ к содержимому. Если они не находят этот файл, они формируют ошибку. Поэтому помните об этом, прежде чем использовать SyndicatedFeed для доступа к данным, или можете столкнуться с проблемами. В сети можно найти много информации о Crossdomain.xml, потому что он де факто является стандартным способом обеспечения междоменного доступа для разных технологий.

Для данного примера мы будем просто использовать статический XML-документ Doc.rss, хранящийся на сервере.

Прежде чем приступать к написанию кода, убедитесь в наличии соответствующих ссылок, которые обеспечивают возможность использовать SyndicatedFeed, потоковую передачу данных и XML

using System.Net;
using System.Xml;
using System.IO;
using System.ServiceModel.Syndication;

Чтобы создать эту ссылку, вероятно, придется добавить ссылку на System.ServiceModel.Syndication.

Следующее, что необходимо сделать до написания кода, - сформировать представление данных в XAML

<UserControl x:Class="RSSClient.Page"
             xmlns="http://schemas.microsoft.com/client/2007"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             Width="400" Height="300">
  <Canvas x:Name="LayoutRoot" Width="400"
          Height="300" Background="White">
    <ItemsControl x:Name=" rssTitles">
      <ItemsControl.ItemTemplate>
        <DataTemplate>
          <StackPanel Orientation="Vertical">
            <TextBlock FontWeight="Bold"
            Text="{Binding Title.Text}" />
          </StackPanel>
        </DataTemplate>
      </ItemsControl.ItemTemplate>
    </ItemsControl>
  </Canvas>
</UserControl>

Здесь в XAML используется объект ItemsControl (Элементы), который в сочетании с ItemTemplate (Шаблон элемента) обеспечит базовую функцию повторения. Этот объект связывается с данными с помощью DataTemplate (Шаблон данных), определяющего, что элемент управления TextBlock связан с данными RSS-канала по Title.

Возвращаясь к C#-коду, теперь можно создать объект WebClient для загрузки RSS-документа. После того, как RSS-документ будет загружен, его можно будет прочитать с помощью элемента управления SyndicatedFeed. Вот код для создания WebClient, выполняющего доступ к RSS-документу:

public Page() {
  InitializeComponent();
  WebClient client = new WebClient();
  Uri uri = new Uri("doc.rss",UriKind.Relative);
  client.OpenReadCompleted + = 
     new OpenReadCompletedEventHandler(client OpenReadCompleted);
  client.OpenReadAsync(uri); 
}

Здесь задается функция обратного вызова ( client OpenReadCompleted ), которая вызывается по завершении загрузки. Вот код этой функции:

void client OpenReadCompleted(object sender,
    OpenReadCompletedEventArgs e) { 
  XmlReader r = XmlReader.Create(e.Result); 
  SyndicationFeed feed = SyndicationFeed.Load(r); 
  rssTitles.ItemsSource = feed.Items; 
}

Здесь создается XmlReader (объект чтения Xml), который считывает результаты обратного вызова и передает их в SyndicationFeed. Также SyndicationFeed содержит соответствующие коллекции, включая коллекцию Items (Элементы). Эта коллекция содержит (кроме всего прочего) Title для элемента RSS, таким образом, задавая свойство ItemsSource элемента ItemsControl коллекции rssTitles, мы выполняем привязку данных, и заголовки будут формироваться Silverlight. Результаты представлены на рис. 10.15.

 Просмотр данных RSS с использованием SyndicationFeed и привязки данных

Рис. 10.15. Просмотр данных RSS с использованием SyndicationFeed и привязки данных

Выходя за рамки таких простых каналов, как RSS и ATOM, Silverlight предоставляет возможность использования таких расширенных сервисов, как ASMX и Веб-сервисы WCF. Это будет рассмотрено в следующем разделе.