当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > ASP.NET Routing对请求的处理方式

ASP.NET
asp.net GridView控件中模板列CheckBox全选、反选、取消
asp.net GridView 删除时弹出确认对话框(包括内容提示)
asp.net DropDownList 三级联动下拉菜单实现代码
asp DataTable添加列和行的三种方法
Asp.net 页面调用javascript变量的值
asp.net 长文章通过设定的行数分页
asp.net 定时间点执行任务的简易解决办法
asp.net 页面延时五秒,跳转到另外的页面
asp.net 动态输出透明gif图片
asp.net DataList与Repeater用法区别
asp.net Javascript获取CheckBoxList的value
asp.net程序在调式和发布之间图片路径问题的解决方法
asp.net下生成英文字符数字验证码的代码
asp.net 页面版文本框智能提示JSCode (升级版)
ASP.NET URL伪静态重写实现方法
ASP.NET 2.0 中Forms安全认证
asp.net 动态添加多个用户控件
asp.net Repeater显示父子表数据,无闪烁
asp.net 无法获取的内部内容,因为该内容不是文本 的解决方法
asp.net GridView排序简单实现

ASP.NET Routing对请求的处理方式


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-17   浏览: 64 ::
收藏到网摘: n/a

原本这是《关于ASP.NET Routing的几点内容》一文中的一节,不过等写完这节之后发现这块内容已经比较完整了,而且它本身也是独立和最为常见的部分,因此我把它提取出来单独成文。至于那片文章的其他部分我会再修改一下,明天发布。希望这些内容会对您理解ASP.NET Routing工作方式,以及阅读ASP.NET Routing的代码有所帮助。

首先,如果您需要在项目中使用在ASP.NET Routing的功能,则需要在web.config文件中配置一个HttpModule:

以下为引用的内容:

<add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, ..." />

其次,您应该在Application_Start中向RouteCollection类型的RouteTable.Routes集合中添加一系列RouteBase对象,并为每个RouteBase对象指定一个独立的名称(大小写无关)。当然,您也可以在运行时动态添加或删除内容(RouteCollection对象是线程安全的),只不过我们平时不太会去这么做而已。值得注意的是,RouteCollections里的RouteBase对象,它们的顺序是非常重要的。

UrlRouteModule会监听ASP.NET Request Pipelines的PostResolveRequestCache事件,在这个事件中UrlRouteModule会将当前的HttpContext作为参数调用RouteTable.Routes集合的GetRouteData方法。在RouteCollection的GetRouteData方法中,又会依次将HttpContext传入每一个RouteBase对象的GetRouteData方法,如果中途某个RouteBase对象返回了一个非null的结果,则这个结果便会直接返回给UrlRouteModule。

如果UrlRouteModule调用RouteTable.Routes.GetRouteData方法得到了null,则“一切都像没有发生过”。如果GetRouteData方法得到了结果——一个RouteData对象,此时RouteData.Values便会包含请求中捕获到的数据。RouteData中另一个重要的成员便是RouteData.RouteHandler属性,它返回一个IRouteHandler对象。IRouteHandler接口中只有一个方法GetHttpHandler,它接受RequestContext作为参数,并返回一个IHttpHandler对象。如ASP.NET MVC框架在利用ASP.NET Routing时,便会使用MvcRouteHandler来返回一个MvcHandler对象。

不过,UrlRouteModule在得到了IRouteHandler对象之后,并不会直接调用其GetHttpHandler方法,而是判断它是不是ASP.NET Routing自带的StopRoutingHandler类型。StopRoutingHandler是个特殊的IRouteHandler对象,它的作用只是告诉UrlRouteModule,虽然某个规则匹配成功了,但是——也还是当什么都没发生过吧。因此,如果我们想要“跳过”一些形式的请求,往往则需要将“忽略”功能放在其他所有规则之前。如:

以下为引用的内容:

public static void RegisterRoutes(RouteCollection routes)
{ routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.IgnoreRoute("scripts/{*pathInfo}"); routes.IgnoreRoute("images/{*pathInfo}"); routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = "" } // Parameter defaults );
}

IgnoreRoute是定义在ASP.NET MVC中,基于RouteCollection类型的扩展方法。它会向RouteCollection中添加一个Route对象,而这个Route对象在匹配成功时返回的RouteData对象,其RouteHandler属性便为一个StopRoutingHandler,于是余下的Routing规则也不会继续匹配了——这一点和RouteBase对象返回null不同,因为如果返回null,则余下的规则还会依次匹配。如果返回了一个包含StopRoutingHander的RouteData,则剩下的Routing规则全部跳过。

如果UrlRouteModule得到的IRouteHandler对象不是StopRoutingHandler,则便会通过其GetHttpHandler方法获得那个IHttpHandler对象。这个IHttpHandler对象会被放入HttpContext的Items集合中。至此,Request Pipeline的PostResolveRequestCache事件便结束了。

UrlRouteModule还会监听PostMapRequest事件,此时Module便会查找HttpContext.Items集合的特定位置中是否包含一个IHttpHandler对象,如果存在,则会将这个对象设为当前HttpContext对象的Handler属性的值。于是当ASP.NET继续执行下去时,便会调用这个Handler的ProcessRequest方法来处理请求了。

如果这个IHttpHandler对象是MvcHttpHandler,那么它便会从RouteData中获取一些数据,构造Controller对象,执行Action等等。如果它是一个DynamicDataHandler,或是WebForm的HttpHandler,那么剩下的便是各自的模型的处理方式了。

因此,ASP.NET Routing是一个通用的组件,它不涉及到任何具体的请求处理方式。如果您需要,也可以自己基于它进行开发——如FubuMvc项目就是这么做的。

原文地址:http://www.cnblogs.com/JeffreyZhao/archive/2009/09/29/aspnet-routing-request-processing.html