Asp.net Routing UrlRewrite

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

此条目发表在technologys分类目录,贴了, , 标签。将固定链接加入收藏夹。