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 请求