代码改变世界

基于ASP.NET AJAX技术开发在线RSS阅读器(上篇)

2007-09-14 15:25  Jacky_Xu  阅读(426)  评论(0编辑  收藏  举报

一、RSS技术简介

RSS是一种描述和同步网站内容的XML格式,已经成为越来越流行的网站内容订阅技术。通过这种技术,网站可以极大地提高广大网站用户和网站数据之间的数据交互。

RSS阅读软件可以分为桌面离线式和在线式两大类。有了这种工具,用户只需要添加初始其所关注的RSS网址,以后系统会自动更新相关内容,网友只需静待观察自己感兴趣的新闻即可。

目前存在多种版本的RSS文件格式,有0.90、0.91、0.92、0.93、0.94、1.0和2.0。其中,最为流行的是2.0版本。下面展示了一个最简单的2.0版本的RSS文件的基本格式:

<?xml version="1.0"?>

<rss version="2.0">

<channel>

<title>Example Channel</title>

<link>http://example.com/</link>

<description>My example channel </description>

<item>

<title>News for September the Second</title>

<link>http://example.com/2002/09/01</link>

<description>other things happened today</description>

</item>

<item>

<title>News for September the First</title>

<link>http://example.com/2002/09/02</link>

</item>

</channel>

</rss>

由上可以,RSS文件的主要节点有rss,频道和item等。其中rss节点表示执行的RSS标准命名空间;频道节点表示在博客或新闻组中的一个类别,通常被译为频道;item节点是用户要查看的主要信息,其中包括信息的标题、信息内容的链接地址及信息的发布时间等。有关RSS文件的完整节点介绍,请参考网址http://cyber.lay.harvard.edu/blogs/gems/tech/rss2sample.xml

关于Robsman的ASP.NET RSS Toolkit

很显然,因RSS文件版本繁多,而且存在一定差距,如果手动解析XML文件费时费力。还好,我们可以利用微软公司开发的开源RSS Toolkit工具包(下载网址:http://blogs.msdn.com/dmitryr/)来简化之。

这个工具包具有如下功能:

1)RSS数据源控件—其使用方式与ASP.NET内置的数据源控件一样,它也支持绑定和支持模板化数据绑定,并为其提供显示所需的数据;

2)可以在内存或磁盘中缓存远程RSS提要对应的内容;

3)基于RSS的URL地址为RSS提要生成易于开发调试的强类型对象;

4)对程序中生成的RSS提要相应的典型操作进行封装。

下面,我们通过一个具体的例子来探讨如何使用这个工具包并基于微软ASP.NET AJAX框架来开发一个简单的RSS新闻阅读器。

二、本系统主要功能及关键技术分析

在正式开工以前,让我们先来了解一下本系统要实现的主要功能以及开发本系统所涉及的主要技术。

(一)主要功能

一个在线RSS阅读器可以把你喜欢的RSS订阅存储在服务器端数据库中以便后来在方便之时在具有因特网连接的任何位置进行访问。典型地,我们可以通过下图1来大致描述一个RSS阅读器的工程流程。

图1:一个RSS阅读器的典型工程流程

根据上面的示意图,我们的RSS阅读器示例工程DAjaxRssReader将主要实现以下目标:

◆添加RSS频道

用户可以把其新输入的RSS频道以及相关的URL信息保存到ASP.NET AJAX客户端数据源控件中。并且当然,他们能够把所有这些信息存储到远端的服务器SQL Server数据库中。

◆显示所有RSS频道

这主要包括两种情况:1、当应用程序首先启动时所有的存储于服务器端数据库中的频道信息都应该能够列出于浏览器端;2、当用户刷新RSS频道时,所有的与频道相关联的数据都可以从服务器端读回并显示于客户端。

◆显示选择的特定RSS频道的详细信息

当用户选择某个频道时,应用程序应该能够展示出相应的与该频道相链接的特定网页内容。

(二)关键技术

首先,在开发任何典型的Web应用程序的过程中,我们都应尽可能地遵循著名的三层结构原则。下图的图2展示了本文中的RSS阅读器程序相应的三层架构略图。

图2:本文RSS阅读器程序的整体架构示意图

接下来,在正式讨论所涉及的关键技术之前,让我们快速地浏览一下示例程序主页面的快照,如下面图3所示。

图3:本文示例RSS阅读器程序设计时刻快照


根据上面所展示的图形及前面的功能分析,我们大致需要基于以下关键技术来开发本文中的应用程序:

1、在描述层,我们需要使用ASP.NET AJAX客户端ListView控件来存储并显示所有RSS频道信息,还有一个服务器端UpdatePanel控件来封装上图中的ASP.NET AJAX Control Toolkit控件Accordion以便最终显示与你从ListView中点选的项相关联的网站内容。此外,我们还需要一点CSS技巧来修饰所有相关的控件。最后,我们还引入了ASP.NET AJAX客户端校验器(Validator)来实现对用户输入的RSS名字和URL的校验功能。

2、在本文示例程序中,我们将混合使用JavaScript与xml-script声明性编程方式。一方面,在实际开发环境下,基于ASP.NET AJAX框架的Web应用程序通常是相当复杂的;另一方面,ASP.NET AJAX框架本身也还没有完全成熟起来以便使我们的构建目标完全基于xml-script声明性编程方式进行开发。尽管实现在实现某些编程时使用JavaScript方式相对xml-script声明性方式相对更复杂一些(因为ASP.NET AJAX客户端提供了十分类似于ASP.NET的声明性编程方式),但是,JavaScript方式的好处在于,它能够控件开发过程中从服务器端到客户端的每一个方面。

3、对于基于ASP.NET AJAX应用程序的数据层开发而言,在线资料中已经提供了典型的实现模式,本文示例将秉承这一模式。

作者注】在调试本文示例程序时,我被因引入ASP.NET AJAX Control Toolkit控件并结合Dmitry Robsman的ASP.NET RSS Toolkit所带来的客户端与服务器端通讯的问题所困扰。根据我的分析,通常情况下,我们无法在一个Web服务内部实现把服务器端的RssDataSource(RSS.NET Toolkit中的一个类)动态地绑定到Accordion控件(实际上是一个ASP.NET AJAX服务端扩展器)。因此,为了克服这一难题,我不得不求助于__doPostBack函数来创建客户端与服务器端的连接;这明显会引发一个整面刷新的问题—这与ASP.NET AJAX规则是根本相冲突的。为此,我不得不引入了ASP.NET AJAX服务器控件UpdatePanel来把Accordion控件“包围”起来以便实现局部更新效果。当然,使得事情进一步复杂化的另一个因此还在于ASP.NET AJAX客户端控件—ListView。从较底层的分析来看,这个ListView控件还远远没有成熟起来!

下面,让我们从数据层设计开发逐步探讨整个示例工程的开发过程。

三、数据层设计

(一)数据库设计

启动Visual Studio 2005,选择“文件→新建网站…”,然后选择“ASP.NET AJAX-Enabled Web Site”模板,命名工程为“AjaxRss”,并选择C#作为内置支持语言,最后点击OK。注意,此后系统将自动加入对于程序集Microsoft.Web.Preview.dll和System.Web.Extensions.dll的引用。当然,你还会注意到,作为ASP.NET AJAX司令部的服务器控件ScriptManager被自动地添加到默认网页Default.aspx中。

现在,请右击工程,选择“添加新项…”,然后选择模板“SQL Database”创建一个命名为RssReader.mdf的空数据库。在本文应用程序中,我们仅在此库中添加一个表格RssStore(其所有字段都显示于下面的表格1中)。此后,我们还要创建四个存储过程:DeleteRecord,GetAllRecords,InsertRecord和UpdateRecord。这四个存储过程分别相应于典型的数据库CRUD操作(ASP.NET AJAX客户端数据绑定技术对此提供了较好的支持方案,本文中即展示之)。所有这些内容在此我们不去赘述。

表格1:表格RssStore相应的结构

字段名

类型

说明

Rss_ID

int

表格主键

Rss_Name

nchar(32)

RSS频道名字

Rss_URL

nchar(64)

RSS频道URI(或者URL

(二)Web服务设计

接下来,我们要编写一个将从客户端以AJAX方式进行调用的Web服务。在本文示例中,我们让该服务返回一个RssInfo对象(用作数据库表格RssStore中记录的OOP包装器)数组。

现在,请以鼠标右击工程并选择“添加新项…”创建一个新的Web服务MyDataService.asmx。然后,打开文件BookDataService.cs,在其中编写我们要求的所有的Web方法—DeleteRecord,GetAllRecords,InsertRecord和UpdateRecord。这四个方法与我以前在51CTO上发表的文章中所涉及的基本一致,在此不多赘述。有兴趣的读者也可参考本文相应源码加以分析。

下面,我们将进入到用户接口设计阶段。

四、用户接口层设计

根据上面介绍的一般框架,我们可以把整个用户接口部分划分成三个子部分:

1)添加新的RSS频道信息;

2)显示RSS频道列表;

3)显示指定的RSS频道内容(即与之相关联的网站内容)。

上面给出的图3已经显示了本文应用程序的设计时刻的用户接口。

在上面的图3中,位于左上角的是一个ASP.NET AJAX客户端控件—ListView;它用于存储和显示RSS频道列表。其下方的.gif动画(注:它相应于控件ListView的emptyTemplate模板部分)仅仅是为了产生一种更为友好的用户体验效果。动画页面的那个较大的矩形区(它包含简单若干个简单的ASP.NET AJAX客户端控件)域对应一个HTML div标签(名为“buttonarea”),提供给用户输入新的RSS频道信息。整个Web页面的右部是一个ASP.NET AJAX Control Toolkit中的Accordion控件,它用于显示指定RSS频道的详细信息。有关于页面中的另外几个“神秘”的小点与包围Accordion控件的ASP.NET AJAX服务器控件UpdatePanel及与之相关联的UpdateProgress控件,我们将在后面详细介绍。现在,你肯定注意到了位于页面最左下角的Rss Toolkit control—RssDataSource控件,它用于从服务器端为Accordion控件提供数据源(一般来说,我们仅能在运行时刻从服务器端使用它,因为它是一个服务器端数据源控件。关于这个控件的细节,后面我们还要介绍)。最后,所有的控件都被使用一个HTML table元素进行包围。

到此为止,我们已经介绍完本软件中的数据层与描述层部分。在下篇中,让我们转入整个开发过程的重点—逻辑层的设计。