• Request请求过来之后,MVC的路由匹配处理过程 + Mvc路由匹配的自定义扩展


    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

  • 相关阅读:
    Docker入门系列4:命令行小结
    Docker入门系列3:使用
    Docker入门系列2 安装
    Docker入门系列1:简介
    在VMware下安装CentOS系列1:配置VMware
    bugzilla 系列1安装
    查看SELinux状态并关闭SELinux
    Qt 编程指南 5 丰富文本编辑控件
    Qt 编程指南 4 单行编辑控件
    Qt 编程指南 4 按钮2 打开网页和文件夹
  • 原文地址:https://www.cnblogs.com/fblogs/p/12292250.html
Copyright © 2020-2023  润新知