本文摘自文章:《Http Handler 介紹》 作者:張子陽
RSS如今已經可以說是隨處可見,而RSS的實現方式,通常是在一個.aspx的CodeBehind文件中寫一個XML文件,然後加載到Response的OutputStream中, Rss源通常是Rss.aspx這種形式的。通過第一章學到的ISAPI的知識,再結合本章學到的關於HttpHandler的知識,很容易想到:我們可以自定一個以 .rss 作爲後綴名的文件來實現 Rss 源,比如說Article.rss。現在我們就一步步來實現它:
NOTE:關於RSS的更多內容,可以參閱我編譯的 在Web站點中創建和使用RSS源。本文不再解釋Rss是什麼,如何創建Rss源,爲了文章的獨立性,僅給出創建過程。
Step.1 創建範例數據庫
Create Table RssSample
(
SampleId Int Identity(1,1) Not Null,
Title Varchar(100) Not Null Constraint uq_Title Unique,
Author Varchar(50) Not Null,
PubDate DateTime Not Null Default GetDate(),
[Description] Varchar(500) Not Null,
Link Varchar(150) Not Null
Constraint pk_RssSample Primary Key(SampleId)
)
-- 插入範例數據
Insert Into RssSample(Title, Author, [Description], Link)
Values('標題1', '作者1', '文章摘要1', 'http://127.0.0.1/#' )
-- 省略 ....
Step.2 建立站點,在App_Code目錄下建立RssFeedsLib.cs文件。
using System;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Web;
using System.Xml;
using System.Text;
namespace RssFeadsLib {
public class RssGenerator {
public static string GetRSS() {
MemoryStream ms = new MemoryStream();
XmlTextWriter writer = new XmlTextWriter(ms, null);
SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=Sample;User ID=sa;Password=sa"); //修改這裏成你的數據庫連接
SqlCommand cmd = new SqlCommand("select * from RssSample order by pubdate desc", conn);
conn.Open();
SqlDataReader reader = cmd.ExecuteReader();
writer.WriteStartElement("rss");
writer.WriteAttributeString("version", "2.0");
writer.WriteStartElement("channel");
// Channel 下的結點靜態寫入
writer.WriteElementString("title", "TraceFact.Net 技術文章");
writer.WriteElementString("link", "http://www.tracefact.net");
writer.WriteElementString("description", "Dedicated to asp.net...");
writer.WriteElementString("copyright", "Copyright (C) 2007");
writer.WriteElementString("generator", "My RSS Generator");
// Item 結點從數據庫讀取
while (reader.Read()) {
writer.WriteStartElement("item");
writer.WriteElementString("author", reader.GetString(reader.GetOrdinal("Author")));
writer.WriteElementString("title", reader.GetString(reader.GetOrdinal("title")));
writer.WriteElementString("link", reader.GetString(reader.GetOrdinal("Link")));
writer.WriteElementString("description", reader.GetString(reader.GetOrdinal("Description")));
writer.WriteElementString("pubDate", reader.GetDateTime(reader.GetOrdinal("PubDate")).ToString(@"ddd, dd MMM yyyy 12:00:00 tt "));
writer.WriteEndElement();
}
writer.WriteEndElement();
writer.WriteEndElement();
reader.Close();
conn.Close();
writer.BaseStream.Flush();
writer.Flush();
ms.Flush();
// 將流轉換成String並返回
byte[] data = new byte[ms.Length];
ms.Seek(0, SeekOrigin.Begin);
ms.Read(data, 0, data.Length);
ms.Close();
return UTF8Encoding.UTF8.GetString(data);
}
}
}
Step.3 創建可以處理 .rss 後綴名的 RssHandler
我們在這個 RssFeedsLib命名空間下,再添加一個類,這個類用於處理對 .rss 後綴名文件的Http請求。
public class RSSHandler:IHttpHandler{
public bool IsReusable
{
get {return false;}
}
public void ProcessRequest(HttpContext context){
context.Response.ContentType = "text/xml";
string str = RssGenerator.GetRSS();
context.Response.Write(str);
}
}
Step.4 在Web.config中進行配置
<httpHandlers>
<add path="*.rss" type="RssFeadsLib.RSSHandler" verb="GET" />
</httpHandlers>
NOTE:因爲這個類和命名空間位於App_Code中,這裏就不需要再手動編譯RssFeadsLib.cs然後將編譯好的.dll應用程序集放到Bin目錄中了。至於爲什麼可以這樣,將會在 《Asp.Net 構架與安全機制 Part.5 – 頁面生存週期與編譯模型》中解釋。
Step.5 在IIS 對ISAPI進行設置。
應該還記得在Part.1中如何在IIS中設置ISAPI來進行文件與處理程序映射:
- 打開IIS,選擇本範例所用的站點,右鍵,選擇“屬性”。
- 選擇“主目錄”選項卡,點擊“配置...”按鈕。
- 點擊“添加”,設置“可執行文件”爲“C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/aspnet_isapi.dll”,設置“擴展名”爲“.rss”,點“確定”。
- 注意,不要勾選“檢查文件是否存在”複選框,這樣不用創建文件,只要在地址欄輸入任意以.rss後綴結尾的文件名,均會交由上面創建的Handler去處理,而不管這個文件是否存在,也不管請求的是Article.rss還是Sample.rss。
進行了這些設置以後,現在IIS就知道如何去處理對.rss後綴名文件的請求了。
Step.6 測試範例
這個時候,隨便打開一個頁面,比如空白的Default.aspx,然後我們在地址欄將文件改爲:Article.rss(改成abc.rss也是一樣),敲回車,應該可以看到如下的畫面。
This posting is provided "AS IS" with no warranties, and confers no rights.