博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
理解ASP.NET MVC系列之二:URL Routing机制:RouteTable
阅读量:5773 次
发布时间:2019-06-18

本文共 1956 字,大约阅读时间需要 6 分钟。

经典的ASP.NET应用程序,当我们请求页面时,通常每一个页面请求都会映射到网站中的一个物理页面。

 

ASP.NET MVC不是以这种方式工作的。当我们请求一个ASP.NET MVC程序的地址时,网站中不一定存在着对应的页面。一般来说,对于ASP.NET MVC网站,我们不会再去请求有着.aspx扩展名的地址,而是请求一个有意义的虚拟地址,ASP.NET MVC通过RouteTable,将这个请求转发到一个叫Controller的类上,Controller负责生成内容并把它发回浏览器。 

所以,在ASP.NET MVC中,就用RouteTable来定义各种URL到实际处理程序之间的映射。

具体而言,是由Route类来指定ASP.NET 应用程序中针对虚拟路径请求的处理方法。 

你可以为每种URL模式来创建一个Route对象。

RouteTableroutes属性是Route对象的集合。

 

创建RouteTable

这里有三个问题需要思考

1)何时创建?

2)在哪里创建?

3)如何创建?

 

答案:

1)何时创建?

在请求处理之前。

 

2)在哪里创建?

Global.asax.cs文件的Application_Start中(注册)。

 

3)如何创建?

下面是VS2010新建ASP.NET MVC项目时默认的Global.aspx.cs文件的代码片段:

 

 

在此文件中,应用程序默认为路由增加了2个路由对象:

第一个路由是用于忽略特殊请求的路由,这个路由忽略所有扩展名为.axd的请求,这些请求会按照WebForm经典的方式进行处理。

第二个路由由映射任何符合{controller}/{action}/{id}模式是URLMvcRouteHandler。它还提供了一个默认的参数。

 

思考:

那么,ASP.NET MVC又是如何通过RouteTable将请求映射到ASP.NET的处理管道中进行处理的呢?

 

其实,在ASP.NET MVC中,HttpApplication的处理管道并没有发生变化,变化的只有处理程序部分。

 

在经典方式下,我们会通过请求路径来定位具体的处理程序或者文件,如果找不到则会返回404错误。所以,必须要在HttpApplication寻找处理程序之前,必须设置一个肯定可以找到的处理器的请求路径。

ASP.NET MVC也是如此。

 

那对于上边的那个思考问题,答案就是:UrlRoutingModule负责解决这个问题。

 

UrlRoutingModule事件处理

当我们对ASP.NET MVC应用程序发起请求的时候,请求被送入HttpApplication的处理管道,UrlRoutingModule注册了HttpApplicationPostResolveRequestCache事件和PostMapRequestHandler事件。 

 

HttpApplication寻找处理程序之前,设置一个肯定可以找到的处理器的请求路径。此时,激发了PostResolveRequestCache事件。 

HttpApplication完成处理程序查询,并成功初始化处理程序之后,在通过RouteTable将处理程序设置到HttpApplication中。此时,激发PostMapRequestHandler事件。

 

下面说一下这两个事件的具体处理步骤:

1UrlRoutingModulePostResolveRequestChche事件中做的第一件事就是包装当前的HttpContextHttpContextWrapper2

 

2)接着把HttpContextWrapper2传给RouteTableRouteTable根据参数返回一个匹配的路由对象:RouteData

 

3)如果UrlRoutingModule成功获取到RouteData,则会创建HttpContext对象和RouteDataRouteContext路由对象。

 

4)然后把RouteContext路由对象传递给Handler的构造函数,实例化出一个新的HttpHandler;同时把此路由对象RouteContext通过HttpContext对象的Items集合保存起来,以便在PostMapRequestHandler中使用。

 

5)最后通过HttpContextReWritePath方法,将当前请求路径设置为一个肯定存在的路径。

 

6)当PostMapRequestHandler事件触发时,ASP.NET已完成了经典的获取处理程序的操作。UrlRoutingModule将检查通过HttpContext对象的Items保存的路由对象,然后通过路由对象的参数来设置当前的处理程序。

转载地址:http://wiaux.baihongyu.com/

你可能感兴趣的文章
duilib+cef自定义浏览器控件编译错误
查看>>
window.open 打开新窗口被拦截的其他解决方法
查看>>
5月8日跨域问题总结
查看>>
pdf导出之TCPDF类
查看>>
ACM算法集锦
查看>>
BZOJ4519[Cqoi2016]不同的最小割——最小割树+map
查看>>
集群部署的单体项目怎么实现解决session问题
查看>>
MYSQL数据库设计规范与原则
查看>>
小米鼠标垫功能奇异 价格也不贵
查看>>
linux主机名 hostname
查看>>
Oracle 操作
查看>>
结构化程序设计04 - 零基础入门学习Delphi13
查看>>
《精通javascript》一些原生js函数
查看>>
前端get和post那些事
查看>>
pom.xml 出错版
查看>>
股票API
查看>>
linux的打包与解压
查看>>
poj2349
查看>>
Django的模板系统
查看>>
实现AJAX局部刷新以及PageMethod方法的使用
查看>>