Extending ASP.NET: RSS Toolkit

понедельник, 31 мая 2010, Александр Краковецкий

RSS формат

В наше время трудно встретить сайты, которые не дают возможность подписаться на RSS-канал - удобное средство публикации новостей. Для чтения RSS лент написано большое количество софта - например, Google Reader, Яндекс Лента, feedly (список RSS-агрегаторов) и т.д. которые позволяют искать и читать новости, управлять своими подписками, а также комментировать и оценивать их.

В данный момент RSS расшифровывается как Really Simple Syndication и имеет версию 2.0. В более ранних версиях RSS означало:

  • Rich Site Summary (RSS 0.9x) — обогащённая сводка сайта;
  • RDF Site Summary (RSS 0.9 и 1.0) — сводка сайта с применением инфраструктуры описания ресурсов;

RSS, по сути, является XML файлом, который имеет следующий формат:

<?xml version="1.0"?><br /><rss version="2.0"><br />  <channel><br />    <title>Liftoff News</title><br />    <link>http://liftoff.msfc.nasa.gov/</link><br />    <description>Liftoff to Space Exploration.</description><br />    <language>en-us</language><br />    <pubDate>Tue, 10 Jun 2003 04:00:00 GMT</pubDate><br /> <br />    <lastBuildDate>Tue, 10 Jun 2003 09:41:01 GMT</lastBuildDate><br />    <docs>http://blogs.law.harvard.edu/tech/rss</docs><br />    <generator>Weblog Editor 2.0</generator><br />    <managingEditor>editor@example.com</managingEditor><br />    <webMaster>webmaster@example.com</webMaster><br /> <br />    <item><br />      <title>Star City</title><br />      <link>http://liftoff.msfc.nasa.gov/news/2003/news-starcity.asp</link><br />      <description>How do Americans get ready to work with Russians aboard the<br />        International Space Station? They take a crash course in culture, language<br />        and protocol at Russia's Star City.</description><br />      <pubDate>Tue, 03 Jun 2003 09:39:21 GMT</pubDate><br />      <guid>http://liftoff.msfc.nasa.gov/2003/06/03.html#item573</guid><br />    </item><br />  </channel><br /></rss><br />

Кроме RSS популярными форматами являются Atom и OPML.

ASP.NET RSS Toolkit

Автором ASP.NET RSS Toolkit является Дмитрий Робсман - один из руководителей подразделения разработки ASP.NET в роли Product Unit Manager. Он курирует развитие новых технологий в ASP.NET, таких как MVC, AJAX и Dynamic Data. Кроме ASP.NET RSS Toolkit Дмитрий является автором веб-сервера Cassini, который полностью написан на управляемом коде.

Блог Дмитрия Робсмана можно посмотреть по ссылке: http://blogs.msdn.com/b/dmitryr/. Интервью на русском языке можно почитать здесь: http://habrahabr.ru/blogs/webdev/46828/.

Первая версия библиотеки была выпущена в декабре 2006 года, вторая (текущая) - в июне 2007 года.

Адрес проекта: http://aspnetrsstoolkit.codeplex.com/

Отображения RSS канала в веб-приложении

Для отображения RSS канала в веб-приложении используется класс RssDocument. Диаграмма класса изображена на рисунке ниже:

Intellisense.png

Класс RssDocument содержит такие основные методы:

  • Load принимает System.Uri, Xml-строку канала или XmlReader. Поддерживаются форматы RSS/Atom/RDF/OPML (тип канала будет определен автоматически).
  • SelectItems возвращает IEnumerable, который позволит работать с набором элементов канала.
  • ToXml возвращает содержимое канала в виде XML строки.
  • ToDataSet возвращает содержимое канала в виде DataSet. Это удобно, если вы хотите связать его с элементом управления, который поддерживает источники данных.

Для того, чтобы показать содержимое канала, можно воспользоваться следующим кодом:

void Page_Load(object sender, EventArgs e)
{
    RssToolkit.Rss.RssDocument rss = RssToolkit.Rss.RssDocument.Load(new System.Uri("http://feeds.feedburner.com/MicrosoftUserGroupVinnitsya"));
    Image1.ImageUrl = rss.Channel.Image.Url;
    GridView1.DataSource = rss.SelectItems();
    GridView1.DataBind();
}

Соответствующий *.aspx файл будет иметь вид:


           
               
                   
                       


                           


                       


                            Published:
                           


                       


                           


                   
               
           
       

В результате на экране будет выведено полностью содержимое канала.

Использование RssDataSource

RssDataSource можно использовать вместе с другими элементами управления в качестве источника данных.

Для этого объявляем библиотеку на странице:

<%@ Register Assembly="RssToolkit" Namespace="RssToolkit.Web.WebControls" TagPrefix="cc1" %>

Далее размещаем на странице, например, DataList и связываем его с RssDataSource:

       
           
               
           

       

       
       

Главным свойством в RssDataSource является адрес необходимого канала.

В результате мы увидим список 10 последних статей:

Кроме того есть возможность выбрать источник данных с помощью визуального дизайнера (воспользуемся изображениями из заметки Скотта Гатри):

Выбираем RSSDataSource в списке источников данных:

Указываем адрес канала:

В результате получим тот же результат.

Использование RssHyperLink

В секции можно задавать адрес каналов, делается это таким образом:

<link rel="alternate" type="application/rss+xml" title="Rss" href="~/RssHyperLink.ashx" />

Браузеры распознают этот тег и отображают иконку в строке навигации, что упрощает пользователю работу с RSS каналами.

В секцию можно добавить RssHyperLink таким образом:

<head>
   <title>Sample page with autodiscovery links</title>
   <art:RssHyperLink ID="myRss" runat="server" IncludeUserName="True" NavigateUrl="~/RssHyperLinkFromCustomClass.ashx">RSS</art:RssHyperLink>
   <art:RssHyperLink ID="myAtom" runat="server" IncludeUserName="True" NavigateUrl="~/RssHyperLinkFromCustomClass.ashx?outputtype=atom">Atom</art:RssHyperLink>
<head>

Если задано свойство ChannelName, то к адресу в NavigateUrl будет добавлено название канала, а именно в виде this ?c=XXX, где XXX - значение ChannelName.

Если свойство IncludeUserName установлено в true, то также к строке NavigateUrl будет добавлен FormsAuthenticationTicket, т.е. будет добавлено ?t=YYY, где YYY - значение FormsAuthenticationTicket (encrypted, base64 encoded).

Публикация собственного канала

Для создания собственного канала можно использовать базу данных в качестве источника данных, генерировать элементы канала программно или считывать с другого источника. Для публикации самого простого канала создадим web handler и добавим туда следующий код:

<%@ WebHandler Language="C#" Class="MyClass" %>

using System;
using System.Web;

public class scenario5 : Sample5HttpHandlerBase {
    protected override void PopulateChannel(string channelName, string userName) {

        Channel.Name = channelName;

        Channel.Items.Add(
            new Sample5Item("Scenario1",
                            "Consuming RSS feed using RssDataSource",
                            "~/scenario1.aspx"));
        Channel.Items.Add(
            new Sample5Item("Scenario2",
                            "Consuming RSS feed using ObjectDataSource",
                            "~/scenario2.aspx"));
        Channel.Items.Add(
            new Sample5Item("Scenario3",
                            "Consuming RSS feed programmatically using strongly typed classes",
                            "~/scenario3.aspx"));
        Channel.Items.Add(
            new Sample5Item("Scenario4",
                            "Consuming RSS feed programmatically using late bound classes",
                            "~/scenario4.aspx"));
    }   
}

Понятно, что все настройки канала вы должны задать свои.

После того, как вы введете адрес вашего web handler в адресной строке, то получите похожий результат:

Кэширование каналов

Класс DownloadManager используется для работы с каналами, которые были закэшированными на локальном диске.

Для этого необходимо в web.config добавить следующие настройки:

<appSettings>
        <add key="defaultRssTtl" value="10"/>
        <add key="rssTempDir" value="c:\temp"/>
</appSettings>

DefaultRssTtl используется в случае, когда не указано время жизни содержимого канала, а также используется для регулирования времени кэширования, которое составляет 1 минуту (если не указано другое значение в web.config).

RssTempDir устанавливает директорию, где будут храниться закэшированное содержимое каналов. Если значение не задано, то будет использоваться временная директория.

Использование RssDl.exe для генерации классов

Компилятор, работающий в режиме командной строки, на основании адреса канала генерирует соответствующий класс на VB.Net или C#.

Использование инструмента достаточно простое:

  • RssDl.exe "URL" "OutputFile"
    • URL может быть ссылкой на RSS/Atom/RDF/OPML каналы.
    • расширение значения OutputFile определяет язык генерируемого класса.
  • Примеры:
    • RssDl.exe “http://news.google.com/?output=rss” GoogleNews.vb
    • RssDl.exe “http://youtube.com/rss/global/top_favorites.rss” YouTube.cs

В результате работы второго примера мы получим следующий файл:

    [XmlElement("player", Namespace="http://search.yahoo.com/mrss/")]
    public YoutubePlayer Player {
        get {
            return _player;
        }
        set {
            _player = value;
        }
    }
    
    [XmlElement("thumbnail", Namespace="http://search.yahoo.com/mrss/")]
    public YoutubeThumbnail Thumbnail {
        get {
            return _thumbnail;
        }
        set {
            _thumbnail = value;
        }
    }
    
    [XmlElement("category", Namespace="http://search.yahoo.com/mrss/")]
    public YoutubeCategory Category {
        get {
            return _category;
        }
        set {
            _category = value;
        }
    }
    
    [XmlElement("credit", Namespace="http://search.yahoo.com/mrss/")]
    public string Credit {
        get {
            return _credit;
        }
        set {
            _credit = value;
        }
    }

Скриншот выполнения команды:

Добавьте полученный файл в ASP.NET проект и добавьте следующий код:

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>YouTube Media Rss</title>
    <script language="c#" runat="server">
        void Page_Load(object sender, EventArgs e)
        {
            YouTubeRss rss = YouTubeRss.Load();
            DataList1.DataSource = rss.Channel.Items;
            DataList1.DataBind();
        }
    </script>
</head>
<body>
    You Tube Top Favories(Media Rss)
    <form id="form1" runat="server">
        <asp:DataList ID="DataList1" runat="server" RepeatColumns="3" GridLines="both">
            <ItemTemplate>
                <asp:Image ID="Image1" runat="Server" ImageUrl='<%# Eval("Thumbnail.Url")  %>' /><br />
                 <asp:HyperLink ID="HyperLink1" NavigateUrl='<%# Eval("Player.Url") %>' Text='Link' runat="server" />
            </ItemTemplate>
        </asp:DataList>
    </form>
</body>
</html>

В результате получим следующий результат:

YouTubeDataViewInBrowser.png

Таким образом, работа с RSS потоками еще больше упрощается.

При написании статьи были использованы материалы:

Enjoy!

Компании из статьи


Яндекс Украина


Сайт:
http://yandex.ru/

Яндекс Украина У Яндекса в Украине три офиса — головной в Одессе, где сосредоточен управленческий аппарат и отдел продаж, и два офиса разработки — киевский, занимающийся разработкой и управлением украинскими проекта...

Ищите нас в интернетах!

Комментарии

Свежие вакансии