ASP.NET 3.5路由总结篇

URL Routing是非常重要的一块技术体系,笔者将URL Routing的知识进行梳理后得出本文,旨在同大家分享,希望能够起到抛砖引玉的作用。

 

1.    什么是URL Routing

 

所谓URL RoutingURL路由),指的是在Web中,URL不再是文件目录中的一个文件,而是一个说明有关URL路由的字符串,开发者可以自定义该字符串的格式。

 

2.    为什么要使用URL Routing

 

主要目的:URL更加的友好,方便web使用者理解相关页面的功能。至于其它目的嘛,这个就太广了,甚至可以在使用中慢慢挖掘它的用处。

 

3.    URL RoutingMVC才有的吗?

 

URL Routing的程序集System.Web.Routing位于.NET框架3.5SP1版本中,是与ASP.NET MVC框架分离的,因此,在WebForm项目中也可以使用路由。

 

4.    如何在WebForm中使用路由?

 

要在WebForm中使用路由,只需要完成4个步骤即可:

 

Ø 添加对System.Web.Routing的引用;

Ø 创建一个实现IRouteHandler接口的类,如WebFormRouteHandler类;

Ø Global.asax.cs中将我们创建的RouteHandler进行全局应用配置;

Ø Web.config中配置System.Web.Routing的引用

 

WebFormRouteHandler类的代码
using System.Web;
using System.Web.Routing;
using System.Web.Compilation;
using System.Web.UI;

namespace RoutingInWebForm
{
    
public class WebFormRouteHandler:IRouteHandler
    {
        
public string VirtualPath{ get;private set; }

        
public WebFormRouteHandler(string virtualPath)
        {
            
this.VirtualPath = virtualPath;
        }

        
public IHttpHandler GetHttpHandler(RequestContext requestContext)
        {
            var page 
= BuildManager.CreateInstanceFromVirtualPath(VirtualPath, typeof(Page)) as IHttpHandler;
            
return page;
        }
    }
}
Global.asax.cs的代码
using System;
using System.Web.Routing;

namespace RoutingInWebForm
{
    
public class Global : System.Web.HttpApplication
    {
        
protected void Application_Start(object sender, EventArgs e)
        {
            RegisterRoutes(RouteTable.Routes);
        }

        
public static void RegisterRoutes(RouteCollection routes)
        {
            routes.Add(
"Named"new Route("foo/bar"new WebFormRouteHandler("~/WebForm1.aspx")));
            routes.Add(
"Number"new Route("one/two/three"new WebFormRouteHandler("~/WebForm2.aspx")));
        }
    }
}

Web.config中配置System.Web.Routing的引用的代码如下:

<httpModules>
      
<add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</httpModules>

在WebForm中使用路由代码下载

 

5.    如何定义URL Routing

 

开发者一般通过Global.asax.cs文件,在Application_Start()中设置路由定义,通过静态类RouteTable的属性Routes来设置URL路由,关于URL Routing的定义,是比较灵活的。

 

6.    如何设定URL Routing的参数默认值?

 

当你定义一个路由时,你可以把一个缺省的值赋给一个参数。如果URL中没有提供此参数值,那么将使用此缺省值。你可以为一个路由设置缺省值,这可以通过把一个字典赋值给Route类的Defaults属性来实现。下列示例给出了一个带有缺省值的路由。

 

设定URL Routing的参数默认值代码
void Application_Start(object sender, EventArgs e)
{
   RegisterRoutes(RouteTable.Routes);
}
public static void RegisterRoutes(RouteCollection routes)
{
 routes.Add(
new Route
 (
    
"Category/{action}/{categoryName}"
         
new CategoryRouteHandler()
 )
   {
      Defaults 
= new RouteValueDictionary
          {{
"categoryName""food"}, {"action""show"}}
    }
 );
}

当URL路由处理一个URL请求时,本例中所定义的路由将产生如下列表格所示的结果。

URL

参数值

/Category

action = "show"

categoryName = "food"

/Category/add

action = "add"

categoryName = "food"

/Category/add/beverages

action = "add"

categoryName= "beverages"

7.    如何为URL Routing添加约束?

 

当你把路由定义添加到路由集合时,你可以添加约束条件。下面的示例添加的约束用于限制在locale和year参数中应该包括什么样的值。


URL Routing添加约束代码
void Application_Start(object sender, EventArgs e)
{
   RegisterRoutes(RouteTable.Routes);
}
 
public static void RegisterRoutes(RouteCollection routes)
{
   routes.Add(
new Route
   (
     
"{locale}/{year}"
        , 
new ReportRouteHandler()
   )
      {
         Constraints 
= new RouteValueDictionary
         {{
"locale""{a-z}{2}-{A-Z}{2}"},{year, @"\d{4}"}}
      });
}

8.    Routing的扩展方法

 

扩展方法的由来:路由程序集(System.Web.Routing)是在2008811日更新的.NET 3.5框架SP1版本中发布的,而ASP.NET 3.5 MVC 1.0版本是在2009318日才正式发布。在ASP.NET MVC版本的不断改进中,微软的开发团队感觉到以往的路由设置给开发者带来不便,但是路由的程序集已经发布,所以将扩展方法加在了System.Web.Mvc程序集的RouteCollectionExtemsion类中。

关于Routing的扩展方法的UML及重载方法如下图所示:


 

 

9.    如何自定义路由约束?

 

要实现自定义路由约束,实际上非常的简单,只需要实现IRouteConstraint接口中的Match()方法即可。

 

10.    如何优化路由设置?

 

Ø 将最常用的路由存放在路由表的最前面

Ø View中指定路由的名称。这样,就不会寻找其它匹配的路由。

 

11.    路由解析的工作机制分析

 

路由解析是按照一定的管道进行的,路由解析的管道图如下所示:

 

 

 

Untitled Page 作者:深山老林
出处:http://wlb.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
posted @ 2009-12-09 21:27 深山老林 阅读(2793) 评论(28) 编辑 收藏

 回复 引用 查看   
#1楼2009-12-09 21:41 | CoolCode      
非常清晰
 回复 引用 查看   
#2楼2009-12-09 21:44 | 永不言败      
好。。十分好
 回复 引用 查看   
#3楼2009-12-09 23:25 | Terry Sun      
字体好大,看着真爽
 回复 引用   
#4楼2009-12-09 23:37 | deded[未注册用户]
请教一下,如果url routing到一个pdf或jpg也ok吗?我试了一下,在var page = BuildManager.CreateInstanceFromVirtualPath(VirtualPath, typeof(Page)) as IHttpHandler;有exception,如何解决呢?
 回复 引用 查看   
#5楼[楼主]2009-12-09 23:40 | 深山老林      
@deded
url routing到一个pdf或jpg也是ok的,不过一般很少会这么去做,通常都是将这些文件放到Content文件夹中,这样就可以像WebForm中那样直接访问了。
另外,关于那个异常的问题,建议下载文中的代码,看看到底问题出在哪里。

 回复 引用   
#6楼2009-12-09 23:54 | oldmoon[未注册用户]
感觉路由技术和URL Rewiter是同出一辙
好文章,从此学习网收录此文:
http://www.***

 回复 引用 查看   
#8楼2009-12-10 00:30 |       
怎么看都是rewrite...
 回复 引用 查看   
#9楼2009-12-10 00:47 | EricZhang(T2噬菌体)      
@
其实目的和rewrite一样。不过rewrite一般是在httpd里实现,如apache或iis里的url rewrite技术,而url routing是在web应用本身里实现URL映射机制,所以还是有些区别的。

 回复 引用 查看   
#10楼[楼主]2009-12-10 08:17 | 深山老林      
@Terry Sun
呵呵,这个是我在word排版好以后copy过来的,不过还是简单重新排版了一下。

 回复 引用 查看   
#11楼[楼主]2009-12-10 08:19 | 深山老林      
@
包子跟馒头看起来都差不多的。

 回复 引用 查看   
#12楼2009-12-10 10:06 | Ivony...      
Routing应该是URL Rewrite的一个更具体的实现。
 回复 引用   
#13楼2009-12-10 11:23 | 淘宝网站[未注册用户]
按时间扩大加速度
 回复 引用 查看   
#14楼2009-12-10 11:36 | 木乃伊      
不错,学习了。
 回复 引用 查看   
#15楼2009-12-10 12:09 | EricZhang(T2噬菌体)      
引用Ivony...:Routing应该是URL Rewrite的一个更具体的实现。

routing和rewrite可以看成是为实现同一个目的的两种方式:例如某人想吃饺子,那么就要把面和肉馅等原材料变成饺子,这是目的。有两种方法可以实现:一是买包好的速冻饺子,这就相当于url rewrite,由外部帮你实现。二是买面和肉、菜回来自己加工自己包,这就相当于routing,自己内部实现。

 回复 引用 查看   
#16楼2009-12-10 12:21 | Jack Niu      
辛苦了,收藏了!
--Jack

 回复 引用 查看   
#17楼2009-12-10 13:58 | Ivony...      
引用EricZhang(T2噬菌体):
引用Ivony...:Routing应该是URL Rewrite的一个更具体的实现。

routing和rewrite可以看成是为实现同一个目的的两种方式:例如某人想吃饺子,那么就要把面和肉馅等原材料变成饺子,这是目的。有两种方法可以实现:一是买包好的速冻饺子,这就相当于url rewrite,由外部帮你实现。二是买面和肉、菜回来自己加工自己包,这就相当于routing,自己内部实现。


哦,,,URL rewrite是一个服务器扩展,我一直以为这是目的的名字来着。。。。

 回复 引用   
#18楼2009-12-10 14:16 | 未登录[未注册用户]
http://localhost/RoutingInWebForm/one/two/three
你好,用你的demo没有实现路由。。。请问哪里iis需要配置什么吗?

 回复 引用   
#19楼2009-12-10 14:57 | 未登录[未注册用户]
iis6对路径无法解析,所以楼主的应该是iis7吧
iis6中需要用aspx后缀

 回复 引用 查看   
#20楼2009-12-10 15:40 | 颓废      
做个记号
 回复 引用 查看   
#21楼[楼主]2009-12-10 19:42 | 深山老林      
@未登录
Demo是我测试过没有问题才上传的。

 回复 引用 查看   
#22楼2009-12-24 15:43 | Amnoh      
十分抱歉,不小心点错了,给点到了反对上,还没法改 - -!
 回复 引用 查看   
#23楼[楼主]2009-12-24 19:43 | 深山老林      
没关系,最重要的通过这个平台大家交换到思想。
 回复 引用 查看   
#24楼[楼主]2009-12-24 19:43 | 深山老林      
@Amnoh
没关系,最重要的通过这个平台大家交换到思想。

 回复 引用 查看   
#25楼2010-09-14 18:44 | nyth      
new CategoryRouteHandler()
在哪里定义的。

 回复 引用 查看   
#26楼[楼主]2010-09-14 21:52 | 深山老林      
@nyth
文章中没有提到这个东东。

 回复 引用 查看   
#27楼2011-10-10 14:48 | Drek      
请教下
iis6如何发布和部署呢。本机调试是OK,一发布就找不到页面。报404错误。iis7当然没问题,可惜公司服务器是iis6的

公告

英文名:Kevin

位置:中国 北京

职位:技术总监

Email:iamwlb@qq.com

昵称:深山老林
园龄:4年
粉丝:90
关注:9