生成网络 Feed 和播客






4.09/5 (8投票s)
本文介绍如何使用包装器类生成 Web Feeds(RSS、Atom、播客)。
引言
本文附带的代码处理创建 Web Feed;可以是 RSS 2.0 或 Atom Syndication 格式。在本文中,我将解释如何使用这些代码。
背景
Web Feed 是一种内容聚合,它允许互联网用户订阅内容,并在有新内容时收到通知,或者轻松检索和重新混合以通用格式提供的。
Web Feed 可以包含文件,例如视频、音频、图片或 PDF 文档。一些 Feed 阅读器/聚合器能够处理音频和视频的播放。在 iTunes 中,可以订阅播客并自动获取新剧集,例如某个系列中的新广播节目或电视节目。
我着手创建一个通用的类来处理内容聚合。在此过程中,我更深入地了解了 RSS 和 Atom 标准,以及使 iTunes 接受并成功订阅 Web Feed 的要求。我在在线验证工具 这里 测试了生成的 Feeds。
Using the Code
代码是用 C# 编写的,包含四个类:Feed
、FeedItem
、FeedEmailAddress
和 FeedItemEnclosure
。
Feed
类包含 Feed 的主要信息以及 Feed 项列表。FeedItem
类表示一个 Feed 项,该项可能还包含一个附件文件。FeedItemEnclosure
类表示附件文件本身,而 FeedEmailAddress
类包含关于某个人的信息(姓名和电子邮件地址)。
Feed
类包含两个方法:WriteRSS
和 WriteAtom
,它们在给定的 HttpContext
中创建和写入 Web Feeds。
这些类可用于 ASP.NET 网站,如以下部分所述。使用 Visual Studio,可以通过选择 File / New / Web Site 来创建网站。或者,在附件的演示包中的演示网站包含了所有内容。
准备网站
- 在网站中,创建 App_Code 文件夹(如果尚不存在)。
- 从本文附带的源代码包中,将包含
Feed
、FeedItem
、FeedEmailAddress
和FeedItemEnclosure
四个类的四个 *.cs 文件添加到 App_Code 文件夹。 - 创建新的 Web 窗体或新的通用处理程序。(在 Visual Studio 中,通过右键单击解决方案资源管理器中的网站并选择 Add New Item 来执行此操作。然后,选择创建 Web 窗体 (ASPX) 或通用处理程序 (ASHX))。
- 在 Web 窗体中,将以下代码添加到
Page_Load
事件处理程序。在通用处理程序中,将以下代码添加到ProcessRequest
方法。
使用 Feed 类
- 在 Web 窗体 (ASPX) 的
Page_Load
事件处理程序中,或在通用处理程序 (ASHX) 的ProcessRequest
方法中,创建Feed
类的实例,并传入必需的参数title
和description
的值。 - 接下来,我需要一些内容来 syndication。它可以是任何内容列表,例如
DataTable
或业务对象的通用列表。在此示例中,我使用 SQL Server 数据库(Nortwhind 数据库)中的数据,并读取 Employees 表中的所有行,如下所示: - 本示例中的 Feed 项是从
SqlDataReader
中的当前行生成的。首先,我为 Feed 项的标题格式化数据,使其如下所示: Ms. Anne Dodsworth, Sales Representativestring title = string.Format("{0} {1} {2}, {3}", reader["TitleOfCourtesy"], reader["FirstName"], reader["LastName"], reader["Title"]);
- 然后,我创建带有必需的
title
的 Feed 项,并提供附加的Description
和PublishDate
。 - 如果要将文件附加到 Feed 项,我会附加文件的 URL、文件的 MIME 类型和大小(以字节为单位),如下所示:
- 现在,我已经完成了 Feed 项的创建,并将其添加到 Feed 中。
- 循环遍历数据后,我准备将 Web Feed 写入当前的
HttpContext
。我选择先创建一个 RSS Feed。对于 Web 窗体 (ASPX),当前的
HttpContext
是Page
的Context
属性。feed.WriteRSS(this.Context);
对于通用处理程序 (ASHX),当前的
HttpContext
是ProcessRequest
方法的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>
- 然后,要创建 Atom Feed,我编写:
- 就是这样。我已经创建了一个 Feed(RSS 或 Atom),用户可以通过我的网站订阅它。
Feed feed = new Feed("Northwind Employees", "Employees in the Northwind database");
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。
FeedItem feedItem = new FeedItem(title)
{
Description = (string)reader["Notes"],
PublishDate = (DateTime)reader["HireDate"]
};
string urlToFile = "http://nothing.nowhere/avatar.jpg";
string mimeType = "image/jpeg";
int sizeInBytes = 30000;
feedItem.Enclosure = new FeedItemEnclosure(urlToFile, mimeType, sizeInBytes);
feed.Items.Add(feedItem);
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>
类中的代码
源代码已注释,我希望这些注释能回答可能出现的任何问题。因此,我选择在此不详细介绍这些类。
如果您查看类中的代码,我将很高兴收到有关错误、改进、建议或其他评论的反馈。我还包含了一些 TODO
注释,指示了将来我可能会更改的地方。
关注点
请注意,要创建 iTunes 可以订阅的播客,请附带 iTunes 支持的文件,并提供正确的 MIME 类型,例如“video/mp4”或“audio/mp3”。有关 iTunes 的 MIME 类型列表,请参阅 Apple 关于 iTunes 播客的页面上的“iTunes RSS Tags”部分。
历史
- 2008-10-26 - 原始文章。