利用HttpHandler創建自定義後綴Rss源

本文摘自文章:《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來進行文件與處理程序映射:

  1. 打開IIS,選擇本範例所用的站點,右鍵,選擇“屬性”。
  2. 選擇“主目錄”選項卡,點擊“配置...”按鈕。
  3. 點擊“添加”,設置“可執行文件”爲“C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/aspnet_isapi.dll”,設置“擴展名”爲“.rss”,點“確定”。
  4. 注意,不要勾選“檢查文件是否存在”複選框,這樣不用創建文件,只要在地址欄輸入任意以.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.
發佈了13 篇原創文章 · 獲贊 9 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章