利用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源,为了文章的独立性,仅给出创建过程。
(
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/#' )
-- 省略 ....
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);
}
}
}
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);
}
}
<add path="*.rss" type="RssFeadsLib.RSSHandler" verb="GET" />
</httpHandlers>
NOTE:
因为这个类和命名空间位于App_Code中,这里就不需要再手动编译
RssFeadsLib.cs然后将编译好的.dll应用程序集放到Bin目录中了。至于为什么可以这样,将会在 《Asp.Net 构架与安全机制
Part.5 – 页面生存周期与编译模型》中解释。
打开IIS,选择本范例所用的站点,右键,选择“属性”。
选择“主目录”选项卡,点击“配置...”按钮。
点击“添加”,设置“可执行文件”为“C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/aspnet_isapi.dll”,设置“扩展名”为“.rss”,点“确定”。
注意,不要勾选“检查文件是否存在”复选框,这样不用创建文件,只要在地址栏输入任意以.rss后缀结尾的文件名,均会交由上面创建的Handler去处理,而不管这个文件是否存在,也不管请求的是Article.rss还是Sample.rss。
进行了这些设置以后,现在IIS就知道如何去处理对.rss后缀名文件的请求了。
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也是一样),敲回车,应该可以看到如下的画面。相关文章推荐
- 利用HttpHandler创建自定义后缀Rss源
- 利用HttpHandler处理自定义控件中需要引用大量js文件问题
- MSDN Visual系列:在SharePoint中创建自定义HttpHandler
- 利用HttpHandler处理自定义控件中需要引用大量js文件问题
- 利用HttpHandler处理自定义控件中需要引用大量js文件问题
- ASP.NET 2.0利用Httphandler实现URL重写(伪URL及伪静态)(转)
- 微信利用PHP创建自定义菜单的方法
- 【译】Asp.net MVC 利用自定义RouteHandler来防止图片盗链 (转)
- Asp.net MVC 利用自定义RouteHandler来防止图片盗链
- [转]利用adsutil.vbs脚本创建自定义web站点
- asp.net利用自定义Http处理程序实现URL伪静态之初探
- 创建自定义 HTTP 模块
- 实战 HTTP 处理程序(HTTP Handler) (1) -- 创建一个最简单的 HTTP Handler
- 利用Httphandler实现URL重写(重写URL及伪静态)
- 转:ASP.NET 2.0利用Httphandler实现URL重写(伪URL及伪静态)
- 利用 ASP.NET 创建多页自定义报表
- 利用HttpHandler生成验证码
- 演练:创建和注册自定义 HTTP 模块
- 利用httpURL 创建代理
- ASP.Net中自定义Http处理及应用之HttpHandler