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

使用 WCF 3.5 Syndication 库发布 RSS 和 ATOM Feed

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.72/5 (17投票s)

2008 年 2 月 5 日

CPOL

5分钟阅读

viewsIcon

110803

downloadIcon

1062

本文重点介绍如何使用 WCF 3.5 库,即 System.ServiceModel.Syndication 命名空间,从同一个代码库创建和发布 RSS 和 Atom feed。

下载 MyNewsSyndicator.zip - 14.2 KB

引言

Windows Communication Foundation 及其 3.5 版本提供了许多新增的实用功能,包括能够更轻松、更统一地发布和使用 syndication feeds,开箱即用。本文重点介绍如何使用 WCF 3.5 库,即 System.ServiceModel.Syndication 命名空间,从同一个代码库创建和发布 RSS 和 Atom feed。

背景

Syndication feeds 是一种数据格式,它为用户提供频繁更新的内容,而无需他们单独访问相应的网站。Atom 和 RSS 是两种流行的 syndication 格式。此功能可帮助读者以自动化方式跟上他们喜欢的网站的最新动态,而无需手动检查每一个网站。这种 syndication 方法在博客、新闻头条和播客等内容提供者中非常受欢迎。

RSS (Really Simple Syndication) 是一种流行的 Web feed 格式,包含相关内容的摘要或全文。另一种 Web feed 格式是 Atom,它在内容模型、日期格式、国际化和模块化方面与 RSS 不同。这些格式的详细信息及其比较超出了本文的范围,但可以在参考文献部分引用的链接中找到。

如上所述,RSS 和 Atom 适用于更多以内容为导向的实体,因此提出了一个重要问题:为什么我们需要一个像 WCF 这样的连接应用程序开发框架来支持 Web feed?答案在于一个词:REST (Representational State Transfer)。简而言之,通过引入 webHttpBinding 和 UriTemplates,微软表明了其对 Web 2.0 模型 REST 风格服务的兴趣和范式转变。Asp.NET MVC 框架也与 REST 风格的开发紧密相关。Syndication 支持是支持这一宏大计划的核心组件之一,该计划包括:

  • Web feeds 被参数化并视为一个服务。
  • HTTP-GET 上的请求和响应基于标准的 Web feeds 格式,该格式被各种聚合器广泛使用。
  • 底层的 WCF 库提供了对 UriTemplate 解析的内置支持,从而利用 HTTP-GET 上的“URI 中的空位”模式进行服务调用。
  • WCF 3.5 为标准化的 Web feed 格式响应提供了内置的 syndication 支持,从而支持跨多个端点的参数化 URI。

稍后将给出一个示例来阐明上述几点。

System.ServiceModel.Syndication 命名空间

System.ServiceModel 是 WCF 3.0 随附的新命名空间,现在随着 WCF 3.5 的发布,微软为其添加了更多命名空间,ServiceModel.Syndication 命名空间是其中之一。

System.ServiceModel.Syndication 的一些重要类如下。

描述

Atom10FeedFormatter

SyndicationFeed 实例序列化为 Atom 1.0 格式(或反序列化)。

Rss20FeedFormatter

SyndicationFeed 实例序列化为 RSS 2.0 格式(或反序列化)。

SyndicationContent

表示 syndication 内容的基类。

SyndicationFeed

代表 Atom 1.0 和 RSS 2.0 中的顶级 feed 对象。

SyndicationFeedFormatter

抽象类,作为格式化器(Atom10FeedFormatterRss20FeedFormatter)的基类。

SyndicationItem

代表 feed 项,例如 RSS 或 Atom。

TextSyndicationContent

代表要显示给最终用户的任何 SyndicationItem 内容。

UrlSyndicationContent

代表由指向另一个资源的 URL 组成的 syndication 内容。

XmlSyndicationContent

代表不打算在浏览器中显示的 XML syndication 内容。

实现

在查看了上面定义的类之后,可以清楚地看出 System.ServiceModel.Syndication 为我们执行 syndication 的繁琐工作提供了框架,包括 Web feeds 的序列化和反序列化。让我们一步一步地看看它是如何工作的。

  1. 在 Visual Studio.NET 2008 中创建一个简单的控制台应用程序。请确保在项目中添加对 System.ServiceModel 和 System.ServiceModel.Web 命名空间的引用,如下图所示。

    AddReferenceDialog.JPG

  2. 为新闻 feed 创建一个接口。WebGet 属性便于 UriTemplate 功能。

   public interface INewsFeed   
   {
        [OperationContract]
        [WebGet(UriTemplate = "GetNews?format={format}")]
        SyndicationFeedFormatter GetNews(string format);
    }         

如你所见,Uri 格式不是进行编程解析,而是在属性中指定为一个模板,并在从 Uri 调用时传递给方法。因此,当用户使用以下 Uri 调用 WebMethod 时:

https://:8000/NewsFeedService/GetNews?format=rss

format 被传递给 GetNews WebMethod 中的 format 参数。

3. 现在让我们设置 Feed Formatter。这是本次开发练习的一个重要部分。如果你正在构建一个博客引擎并希望公开 RSS 或 Atom feed,那么使用 Syndication 类可以使你的工作变得轻松得多。

SyndicationFeed feed = new SyndicationFeed("Technical
News Feed", "Technical News Feed", new Uri("http://WcfInsiders.com"));            
feed.Authors.Add(new SyndicationPerson(""</span">"</span">adnanmasood@gmail.com"));           
feed.Categories.Add(new SyndicationCategory("Technical News"));           
feed.Description = new TextSyndicationContent("Technical News demo for RSS and ATOM publishing via WCF"); 

4. 这是添加内容的步骤,我们在其中指定 SyndicationItems。该方法支持多种重载,这里使用的是其中之一。

SyndicationItemOverload.JPG

           
SyndicationItem item1 = new SyndicationItem( "Overhaul of net addresses begins",                
"The first big steps on the road to overhauling the net's core addressing system have been taken. On Monday the master address books for the
net are being updated to include records prepared in a new format known as IP version 6...",               
new Uri("http://news.bbc.co.uk"),               
System.Guid.NewGuid ().ToString(),           
DateTime.Now);

现在已经创建了 syndication 项,让我们将这些项添加到 Syndication 项的通用列表中。

List<SyndicationItem> items = new List<SyndicationItem>();
items.Add(item1);  

6. 最后但同样重要的是,根据所需的格式(即 RSS 或 Atom)来提供这些项。服务这些项。
           if (format == "rss") 
                return new Rss20FeedFormatter(feed);
            else if (format == "atom")
                return new Atom10FeedFormatter(feed); 

7. 还需要另一个关键步骤来实际托管 feed。我们上面所做的都是关于创建 feed,现在我们需要实际托管它。与任何其他服务一样,托管需要我们提供一个端点 Uri。

   Uri address = new Uri("https://:8000/NewsFeedService/");

以及一个相应的服务主机
           
WebServiceHost svcHost = new WebServiceHost(typeof(NewsFeedService), address);  

下一步是打开服务主机

svcHost.Open();  

并加载相应的读取器。这需要分两步完成,并且是 SyndicationFeed 过程的核心。

首先,通过 XMLReader.Create 暴露 GetNews WebMethod 的 Uri。

XmlReader atomReader = XmlReader.Create("https://:8000/NewsFeedService/GetNews?format=atom");

然后将相应的 XmlReader 实例加载到 syndication feed 中。

               
SyndicationFeed atomFeed = SyndicationFeed.Load(atomReader);

对 RSS feed 重复相同的过程,瞧,你就可以获得 Atom 和 RSS feeds,这些 feeds 以后可以被任何 RSS 聚合器(读取器)使用。

NewsSyndicatorConsole.JPG

图:新闻 Syndication 应用程序

AddingTheFeed.JPG

图:将 Atom feed 添加到 SharpReader

DisplayingTheFeeds.JPG

图:在 SharpReader RSS Aggregator 中显示 RSS 和 Atom Feeds。

完整的源代码可以从文章提供的链接下载,你可以使用它来亲自测试全部功能。

结论

为 syndication 提供 WCF 框架是迈向基于标准 Web 数据通信的 UriTemplate 风格分布式通信框架能力建设的重要一步。如果你正在编写一个简单的博客引擎或一个通过发布/订阅事件风格通信暴露其事件的复杂企业服务总线,这些库都提供了巨大的价值。

参考文献

使用 WCF 3.5 Syndication 库发布 RSS 和 ATOM Feeds - CodeProject - 代码之家
© . All rights reserved.