65.9K
CodeProject 正在变化。 阅读更多。
Home

生成网络 Feed 和播客

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.09/5 (8投票s)

2008 年 10 月 26 日

BSD

4分钟阅读

viewsIcon

32817

downloadIcon

724

本文介绍如何使用包装器类生成 Web Feeds(RSS、Atom、播客)。

引言

本文附带的代码处理创建 Web Feed;可以是 RSS 2.0Atom Syndication 格式。在本文中,我将解释如何使用这些代码。

背景

Web Feed 是一种内容聚合,它允许互联网用户订阅内容,并在有新内容时收到通知,或者轻松检索和重新混合以通用格式提供的。

Web Feed 可以包含文件,例如视频、音频、图片或 PDF 文档。一些 Feed 阅读器/聚合器能够处理音频和视频的播放。在 iTunes 中,可以订阅播客并自动获取新剧集,例如某个系列中的新广播节目或电视节目。

我着手创建一个通用的类来处理内容聚合。在此过程中,我更深入地了解了 RSS 和 Atom 标准,以及使 iTunes 接受并成功订阅 Web Feed 的要求。我在在线验证工具 这里 测试了生成的 Feeds。

Using the Code

代码是用 C# 编写的,包含四个类:FeedFeedItemFeedEmailAddressFeedItemEnclosure

FeedGenerator2.gif

Feed 类包含 Feed 的主要信息以及 Feed 项列表。FeedItem 类表示一个 Feed 项,该项可能还包含一个附件文件。FeedItemEnclosure 类表示附件文件本身,而 FeedEmailAddress 类包含关于某个人的信息(姓名和电子邮件地址)。

Feed 类包含两个方法:WriteRSSWriteAtom,它们在给定的 HttpContext 中创建和写入 Web Feeds。

这些类可用于 ASP.NET 网站,如以下部分所述。使用 Visual Studio,可以通过选择 File / New / Web Site 来创建网站。或者,在附件的演示包中的演示网站包含了所有内容。

准备网站

  • 在网站中,创建 App_Code 文件夹(如果尚不存在)。
  • 从本文附带的源代码包中,将包含 FeedFeedItemFeedEmailAddressFeedItemEnclosure 四个类的四个 *.cs 文件添加到 App_Code 文件夹。
  • 创建新的 Web 窗体或新的通用处理程序。(在 Visual Studio 中,通过右键单击解决方案资源管理器中的网站并选择 Add New Item 来执行此操作。然后,选择创建 Web 窗体 (ASPX) 或通用处理程序 (ASHX))。
  • 在 Web 窗体中,将以下代码添加到 Page_Load 事件处理程序。在通用处理程序中,将以下代码添加到 ProcessRequest 方法。

使用 Feed 类

  1. 在 Web 窗体 (ASPX) 的 Page_Load 事件处理程序中,或在通用处理程序 (ASHX) 的 ProcessRequest 方法中,创建 Feed 类的实例,并传入必需的参数 titledescription 的值。
  2. Feed feed = new Feed("Northwind Employees", "Employees in the Northwind database");
  3. 接下来,我需要一些内容来 syndication。它可以是任何内容列表,例如 DataTable 或业务对象的通用列表。在此示例中,我使用 SQL Server 数据库(Nortwhind 数据库)中的数据,并读取 Employees 表中的所有行,如下所示:
  4. string connectionString = 
        @"Data Source=.\SqlExpress;Initial Catalog=Northwind;Integrated Security=True";
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        using (SqlCommand command = new SqlCommand(@"
            SELECT LastName, FirstName, Title, TitleOfCourtesy, HireDate, Notes 
                FROM Employees 
                ORDER BY HireDate DESC, LastName ASC"
            , connection))
        {
            connection.Open();
            using (SqlDataReader reader = command.ExecuteReader())
            {
                while (reader.Read())
                {
                    // TODO: CREATE FEED ITEM (STEPS 3-5 BELOW)
                    // TODO: ADD FEED ITEM TO FEED (STEP 6 BELOW)
                }
            }
            connection.Close();
        }
    }

    在上面的内部循环中,我创建并添加每个 Feed 项,请参见下面的步骤 3-6。

  5. 本示例中的 Feed 项是从 SqlDataReader 中的当前行生成的。首先,我为 Feed 项的标题格式化数据,使其如下所示: Ms. Anne Dodsworth, Sales Representative

    string title = string.Format("{0} {1} {2}, {3}", 
      reader["TitleOfCourtesy"], reader["FirstName"], 
      reader["LastName"], reader["Title"]);
  6. 然后,我创建带有必需的 title 的 Feed 项,并提供附加的 DescriptionPublishDate
  7. FeedItem feedItem = new FeedItem(title)
    {
        Description = (string)reader["Notes"],
        PublishDate = (DateTime)reader["HireDate"]
    };
  8. 如果要将文件附加到 Feed 项,我会附加文件的 URL、文件的 MIME 类型和大小(以字节为单位),如下所示:
  9. string urlToFile = "http://nothing.nowhere/avatar.jpg";
    string mimeType = "image/jpeg";
    int sizeInBytes = 30000;
    feedItem.Enclosure = new FeedItemEnclosure(urlToFile, mimeType, sizeInBytes);
  10. 现在,我已经完成了 Feed 项的创建,并将其添加到 Feed 中。
  11. feed.Items.Add(feedItem);
  12. 循环遍历数据后,我准备将 Web Feed 写入当前的 HttpContext。我选择先创建一个 RSS Feed。

    对于 Web 窗体 (ASPX),当前的 HttpContextPageContext 属性。

    feed.WriteRSS(this.Context);

    对于通用处理程序 (ASHX),当前的 HttpContextProcessRequest 方法的 context 参数。

    feed.WriteRSS(context);

    生成的 RSS Feed 具有以下 XML 内容:

    <?xml version="1.0" encoding="utf-8" ?>
    <rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" 
         xmlns:media="http://search.yahoo.com/mrss/"
         xml:lang="" version="2.0">
      <channel>
        <title>Northwind Employees</title>
        <link>https://:51529/FeedDemoWebSite/default.aspx</link>
        <description>Employees in the Northwind database</description>
        <atom:link xmlns:atom="http://www.w3.org/2005/Atom" rel="self" 
            href="https://:51529/FeedDemoWebSite/default.aspx" 
            type="application/rss+xml" />
        <ttl>60</ttl>
        <docs>http://cyber.law.harvard.edu/rss/rss.html</docs>
        <pubDate>Sun, 26 Oct 2008 16:36:31 GMT</pubDate>
        <lastBuildDate>Sun, 26 Oct 2008 16:36:31 GMT</lastBuildDate>
        <itunes:explicit>no</itunes:explicit>
        <itunes:subtitle>Employees in the Northwind database</itunes:subtitle>
        <itunes:summary>Employees in the Northwind database</itunes:summary>
        <item>
          <title>Ms. Anne Dodsworth, Sales Representative</title>
          <description>
            Anne has a BA degree in English from St. Lawrence College. 
            She is fluent in French and German.
          </description>
          <pubDate>Tue, 15 Nov 1994 00:00:00 GMT</pubDate>
          <enclosure url="http://nothing.nowhere/avatar.jpg" 
             type="image/jpeg" length="30000" />
          <itunes:subtitle>
            Anne has a BA degree in English from St. Lawrence College. 
            She is fluent in French and German.
          </itunes:subtitle>
          <itunes:summary>
            Anne has a BA degree in English from St. Lawrence College. 
            She is fluent in French and German.
          </itunes:summary>
          <media:content url="http://nothing.nowhere/avatar.jpg" 
             fileSize="30000" type="image/jpeg" />
        </item>
        <item>
          ...
        </item>
      </channel>
    </rss>
  13. 然后,要创建 Atom Feed,我编写:
  14. feed.WriteAtom(this.Context)

    生成的 Atom Feed 具有以下 XML 内容:

    <?xml version="1.0" encoding="utf-8"?>
    <feed xmlns="http://www.w3.org/2005/Atom">
      <title type="html">Northwind Employees</title>
      <link rel="self" type="application/atom+xml" 
         href="https://:51529/FeedDemoWebSite/default.aspx" />
      <subtitle type="html">Employees in the Northwind database</subtitle>
      <id>https://:51529/FeedDemoWebSite/default.aspx</id>
      <updated>2008-10-26T16:40:42.5191442Z</updated>
      <entry>
        <title>Ms. Anne Dodsworth, Sales Representative</title>
        <updated>1994-11-15T00:00:00Z</updated>
        <content type="html">
          Anne has a BA degree in English from St. Lawrence College. 
          She is fluent in French and German.
        </content>
        <link rel="enclosure" type="image/jpeg" 
          length="30000" href="http://nothing.nowhere/avatar.jpg" />
      </entry>
      <entry>
        ...
      </entry>
    </feed>
  15. 就是这样。我已经创建了一个 Feed(RSS 或 Atom),用户可以通过我的网站订阅它。
  16. FeedGenerator1.jpg

类中的代码

源代码已注释,我希望这些注释能回答可能出现的任何问题。因此,我选择在此不详细介绍这些类。

如果您查看类中的代码,我将很高兴收到有关错误、改进、建议或其他评论的反馈。我还包含了一些 TODO 注释,指示了将来我可能会更改的地方。

关注点

请注意,要创建 iTunes 可以订阅的播客,请附带 iTunes 支持的文件,并提供正确的 MIME 类型,例如“video/mp4”或“audio/mp3”。有关 iTunes 的 MIME 类型列表,请参阅 Apple 关于 iTunes 播客的页面上的“iTunes RSS Tags”部分。

历史

  • 2008-10-26 - 原始文章。
© . All rights reserved.