一、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閱讀器的工程流程。
根據上面的,我們的RSS閱讀器樣本工程DAjaxRssReader將主要實現以下目標:
◆添加RSS頻道
使用者可以把其新輸入的RSS頻道以及相關的URL資訊儲存到ASP.NET AJAX用戶端資料來源控制項中。並且當然,他們能夠把所有這些資訊儲存到遠端的伺服器SQL Server資料庫中。
◆顯示所有RSS頻道
這主要包括兩種情況:1、當應用程式首先啟動時所有的儲存於伺服器端資料庫中的頻道資訊都應該能夠列出於瀏覽器端;2、當使用者重新整理RSS頻道時,所有的與頻道相關聯的資料都可以從伺服器端讀回並顯示於用戶端。
◆顯示選擇的特定RSS頻道的詳細資料
當使用者選擇某個頻道時,應用程式應該能夠展示出相應的與該頻道相連結的特定網頁內容。
(二)關鍵技術
首先,在開發任何典型的Web應用程式的過程中,我們都應儘可能地遵循著名的三層結構原則。的圖2展示了本文中的RSS閱讀器程式相應的三層架構略圖。
接下來,在正式討論所涉及的關鍵技術之前,讓我們快速地瀏覽一下樣本程式首頁面的快照,如下面圖3所示。
根據上面所展示的圖形及前面的功能分析,我們大致需要基於以下關鍵技術來開發本文中的應用程式:
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元素進行包圍。
到此為止,我們已經介紹完本軟體中的資料層與描述層部分。在下篇中,讓我們轉入整個開發過程的重點—邏輯層的設計。