1. http请求为什么要走路由匹配?
http请求处理环节非常多->会把这些环节处理封装成事件event-->ihttpmoudle可以在网站启动时给事件注册动作,网站i懂得时候回加载他的init方法
-->那么在请求进来后,会完成module注册的动作->UrlRoutingModule注册动作--》请求进来后就在这里完成了对路由规则的匹配
2.Request请求过来之后,Mvc的路由匹配处理过程
在Application_start方法中注册路由,
-->在路由的配置文件中添加路由到RouteCollection,然后更具添加路由的先后顺序去匹配路由(BrowserRoute自定义)
-->匹配路由之后,更具当前路由,利用MvcRouteHandle生成IHttpHandler
-->利用HttpHandle调用对应的控制器和Action
3. 源码分析和扩展
1).如果路由匹配没有结果,那么什么事也不会发生,继续之前的流程(asp.net)
2).如果当前请求指向一个具体的物理文件,就return null
***1+2 所以,webform在MVC也是可以共存的 -->http://localhost:7088/webform1.aspx
3).路由是foreach迭代匹配的,遇到第一个吻合的,直接结束
4).通过GetRouteData完成匹配---路由扩展类BrowserRoute
4.1) 在路由匹配的时候,修改了匹配方式,可以匹配请求中的任何信息,完成跳转
5). 请求发过来之后是路由匹配之后,怎么到达控制器和Action?
在MvcRouteHandler中的方法GetHttpHandler实现的--->扩展该方法在类CustomRouteHandle
***将MvcRouteHandler换成CustomRouteHandle,就可以自己按照自己的想法返回想返回的东西,调用想调用的控制器和action方法
4.代码层面实现MVC路由匹配的扩展
1)在路由配置文件中向RouteCollection添加自定义路由
2)自定义路由继承RouteBase,并且重写GetRouteData方法,创建自己的RouteData的时候如果调用的是默认的MvcRouteHandler,那么RouteData必须有value值
3)自定义路由继承RouteBase,并且重写GetRouteData方法,创建自己的RouteData的时候如果调用的是自定义IRouteHandler
4) 自定义继承自接口IRouteHandler的类CustomRouteHandler,实现GetHttpHandle方法
5) 自定义继承自接口IHttpHandler的类CustomHttpHandler,实现ProcessRequest方法,将IsReusable改为true