void Application_Start(object sender, EventArgs e)
{
//调用 RegisterRoutes() 来注册 Url 路由
RegisterRoutes(RouteTable.Routes);
}
private static void RegisterRoutes(RouteCollection routes)
{
IRouteHandler rssRouteHandler = new RssRouteHandler();
//对于 /rss-type-num 这种规则的 Url 会转到 rssRouteHandler 实例来处理
routes.Add(new Route("rss-{type}-{num}", rssRouteHandler));
//可以调用 Add 注册多个路由项,还可以使用正则表达式
//比如下面,Url 为 /rss/type/num/2010-02-12/2010-8-9 转到 rssRouteHandler 来处理
routes.Add(new Route("rss/{type}/{num}/{dateStart}/{dateEnd}",
new RouteValueDictionary(),
new RouteValueDictionary(
new { dateStart = @"\d{4}-\d{1,2}-\d{1,2}", dateEnd = @"\d{4}-\d{1,2}-\d{1,2}" }
), rssRouteHandler));
}
using System.Web;
using System.Web.Routing;
/// <summary>
/// Summary description for RssRouteHandler
/// </summary>
public class RssRouteHandler : IRouteHandler
{
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
return new RssProvider(requestContext);
}
}
using System;
using System.Web;
using System.Web.Routing;
/// <summary>
/// Summary description for RssProvider
/// </summary>
public class RssProvider : IHttpHandler
{
public RequestContext RequestContext { get; private set; }
public RssProvider(RequestContext context)
{
this.RequestContext = context;
}
//暂且让它只处理 /rss-type-num 规则的 Url
public virtual void ProcessRequest(HttpContext context)
{
string type = RequestContext.RouteData.Values["type"].ToString();
int num = Int32.Parse(RequestContext.RouteData.Values["num"].ToString());
//比如可以转换出实际 URI 去执行
//context.Server.Execute("rss.aspx?type="+type+"&num="+num);
context.Response.Write("Type: " + type +" ; " + "Number: " + num + "<br/>");
context.Response.Write("根据上面条件设置响应头,输出需要的 RSS 数据。");
}
public bool IsReusable
{
get { return false; }
}
}
配置 IIS6 使其他未知请求类型也由 Asp.Net 来处理
如果是在 Visual Studio 2008 的调试环境可以不作此配置,自动支持。
对于 IIS 7 也不需要作特别的设置。XP 环境的 IIS6 和 Win2003 下的 IIS6 配置还略有不同:
Win2003 下 IIS6 配置:Default Web Site 的属性,Home Directory 标签页里,Configuation...,为
Wildcard application maps(order of implementation) Insert 一项,
指向到 c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,不勾
选 Verify that file exists. XP 下的 IIS6 配置:虚拟目录的属性页(不是 Default Web Site Properties 了), Virtual Directory 标
签页中,点 Configuration 按钮,Maapings, 点 Add 按钮,Add/Edit Application Extensiona Mapping 窗口
里,Executable 里选择 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll,Extension 里填 .*,然后不选 Check that file exists,确定就行了。这样就完成了,通过 /rss-type-num 或 /rss/type/num/dateStart/dateEnd 就会执行到 RssProvider 的 ProcessRequest() 方法中,这样就完成了真实 Url 的重写,也能实现不需要 aspx 文件处理 Http 请求