您的位置:首页 > 理论基础 > 计算机网络

利用HttpHandler创建自定义后缀Rss源

2011-05-28 22:11 239 查看
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也是一样),敲回车,应该可以看到如下的画面。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: