请求一个MVC页面的处理过程

1.浏览器发送一个Home/Index 的链接请求到iis。iis发现时一个asp.net处理程序。则调用asp.net_isapi 扩展程序发送asp.net框架

2.在asp.net的第七个管道事件中会遍历UrlRoutingModule中RouteCollection的RoteBase集合 通过调用其GetRouteData方法进行路由匹配返回一个实现了IRoteHandler的类的对象,没有则返回null继续向下遍历

3.调用IRoteHandler的getIhttpHanderl获得实现了IhttpHandler的类的对象。再在11 到12个事件管道调用其ProcessRequset 执行处理逻辑将结果写入response

这里我们会发现很多个扩展点 1.自定义RoteBase 写入集合  2.自定义IroteHandler   3.自定义IhttpHandler

尝试自定一个RoteBase 并添加到UrlRoutingModule的RoteBase集合中

    public class MyRote : RouteBase{/// <summary>/// 此方法是处理请求是否跟当前路由匹配/// </summary>/// <param name="httpContext"></param>/// <returns></returns>public override RouteData GetRouteData(HttpContextBase httpContext){//假如我们定义 如果是谷歌用户则命中路由当前路由if (httpContext.Request.UserAgent.IndexOf("Chrome") >= 0){RouteData rd= new RouteData(this, new MvcRouteHandler());//假设命中了此路由 解析获得请求控制器为Home action方法为Indexrd.Values.Add("controller", "Home");rd.Values.Add("action", "MyRoteIndex");return rd;}return null;}/// <summary>/// 此方法 在通过Url.action()的时候根据当前路由生成路径/// </summary>/// <param name="requestContext"></param>/// <param name="values"></param>/// <returns></returns>public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values){return new VirtualPathData(this,"Home/MyRoteIndex");}}在RouteConfig添加到UrlRoutingModule 的RouteCollection中
public class RouteConfig{public static void RegisterRoutes(RouteCollection routes){routes.IgnoreRoute("{resource}.axd/{*pathInfo}");/****  因为路由匹配是遍历匹配的 所以我们写到第一个位置。否则可能会出现匹配到下面的路由 *添加到RoteBase集合。下面的方法是个扩展方法内部也是调用的add方法***/routes.Add("myRote", new MyRote.MyRote());routes.MapRoute(name: "Default",url: "{controller}/{action}/{id}",defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });}}这个时候我们用谷歌就会发现无论我们请求哪个页面 都是调用Home/MyRoteIndex  还有在视图页面通过@url.acton 通过路由生成链接也是都是Home/MyRoteIndex

2.自己实现自己的RoteHandler 和IhttpHandler
    public class MyRoteHandler :IRouteHandler{public IHttpHandler GetHttpHandler(RequestContext requestContext){//返回我们自己的IttpHandler处理对象return new MyIHttpHandler();}}public class MyIHttpHandler : IHttpHandler{public bool IsReusable{get { return true; }}/**** 我们之前说了 在第11到12个事件管道是调用这个方法写入response * MVC实现的IhttpHandler则是通过匹配的路由 反射调用指定控制器的action方法 再调用ActionrResult的ExcuteReuslt方法将结果写入response* asp.net处理页面则是调用后台页类的ProcessRequset方法处理我们程序员写的逻辑了***/public void ProcessRequest(HttpContext context){if (context.Request.UserAgent.IndexOf("Chrome") >= 0){context.Response.Write("当前是谷歌浏览器");}else if (context.Request.UserAgent.IndexOf("MSIE") >= 0){context.Response.Write("当前是Ie浏览器");}else{context.Response.Write("其他浏览器");}}}

        /// <summary>/// 此方法是处理请求是否跟当前路由匹配/// </summary>/// <param name="httpContext"></param>/// <returns></returns>public override RouteData GetRouteData(HttpContextBase httpContext){//方便调试则默认他是全部请求匹配此路由if (true){//这里的RoteHandler则返回我们自己的实现RouteData rd= new RouteData(this, new MyRoteHandler());//假设命中了此路由 解析获得请求控制器为Home action方法为Indexrd.Values.Add("controller", "Home");rd.Values.Add("action", "MyRoteIndex");return rd;}}/// <summary>/// 此方法 在通过Url.action()的时候根据当前路由生成路径/// </summary>/// <param name="requestContext"></param>/// <param name="values"></param>/// <returns></returns>public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values){return new VirtualPathData(this,"Home/MyRoteIndex");}

因为都是匹配我们的自己实现的路由 和返回我们自己的RoteHandelr 最终结果是请求任何url都是执行我们自己的IttpHanler的处理逻辑的方法

 

转载于:https://www.cnblogs.com/LQBlog/p/5244366.html

深入了解Mvc路由系统相关推荐

  1. MVC5路由系统机制详细讲解

    转自:http://www.lanhusoft.com/Article/213.html 请求一个ASP.NET mvc的网站和以前的web form是有区别的,ASP.NET MVC框架内部给我们提 ...

  2. asp.net MVC 路由机制 Route

    1:ASP.NET的路由机制主要有两种用途: -->1:匹配请求的Url,将这些请求映射到控制器 -->2:选择一个匹配的路由,构造出一个Url 2:ASP.NET路由机制与URL重写的区 ...

  3. .NET/ASP.NET Routing路由(深入解析路由系统架构原理)

    阅读目录: 1.开篇介绍 2.ASP.NET Routing 路由对象模型的位置 3.ASP.NET Routing 路由对象模型的入口 4.ASP.NET Routing 路由对象模型的内部结构 4 ...

  4. python路由编程_Python Django基础二之URL路由系统

    MVC和MTV框架 MVC Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的.松耦合的方式连接在一起,模型负责业务 ...

  5. ASP.NET Core 3.x - 为什么采用新的 Endpoint Routing 路由系统

    Endpoint Routing 路由系统 ASP.NET Core 3.x 使用了一套叫做 Endpoint Routing 的路由系统.这套路由系统在ASP.NET Core 2.2 的时候就开始 ...

  6. 精通ASP.NET MVC ——路由

    本文章将关注定义路由,并使用它们去处理URL,使用户能够到达控制器和动作. 文章非常长,可以对路由机制有较初步的了解.首先创建示例项目,项目名为UrlAndRoutes,如下图所示: 然后是创建示例控 ...

  7. ASP.NET的路由系统:URL与物理文件的分离

    表现为请求地址与目标Controller和Action的动态映射的URL路由系统并不是专属于ASP.NET MVC,而是直接建立在ASP.NET 中.ASP.NET通过URL路由系统实现了请求地址与物 ...

  8. ASP.NET MVC路由扩展:路由映射

    上周我写了三篇文章(一.二.三)详细地介绍了ASP.NET的路由系统.ASP.NET的路由系统旨在通过注册URL模板与物理文件之间的映射进而实现请求地址与文件路径之间的分离,但是对于ASP.NET M ...

  9. ASP.NET路由系统实现原理:HttpHandler的动态映射

    我们知道一个请求最终通过一个具体的HttpHandler进行处理,而我们熟悉的用于表示一个Web页面的Page对象就是一个HttpHandler,被用于处理基于某个.aspx文件的请求.我们可以通过H ...

最新文章

  1. php水平垂直居中,html水平垂直居中的问题
  2. android 版本更新原理,Android系统Recovery工作原理之使用update.zip升级过程分析(二)...
  3. python字典 items函数
  4. 启动HBase抛出org.apache.hadoop.hbase.ClockOutOfSyncException异常:hmaster正常,节点hregionserver启动失败
  5. [Vijos 1143]三取方格数
  6. 选哪个云计算平台部署自己的网站?
  7. Python的简史:一切从讨厌花括号开始
  8. 内存分析_Redis内存爆炸增长?你需要知道这一套Redis内存分析方法
  9. JUnit5 断言示例
  10. Mac鼠标增强软件Bettertouchtool
  11. 外包以小时计算金额的费用_全了!各大税种的计算公式,建议收藏!
  12. java算法面试题及答案pdf,中信银行Java笔试题库
  13. 量子计算机采用量子力学原理,量子力学原理及其应用.docx
  14. word封面下划线对齐
  15. python xlsm_Excel中的xls、xlsx、xlsm混合文件,看我如何用Python统一处理!
  16. 在阿里云用python发送邮件
  17. 【课程设计】基于图像处理的一维条形码识别-含matlab源码
  18. 新年新玩法,数组“招婿”:老许,你要老婆不要?
  19. 线阵CCD相机与面阵相机的区别
  20. 【原】Java学习笔记025 - 内部类

热门文章

  1. 插入始终是1_40分!1分钟4次!大JB太硬了!
  2. 背景图像位置css_CSS背景图像大小教程–如何对整页背景图像进行编码
  3. mysql complete_mysql 无意重启 [Note] /usr/sbin/mysqld: Normal shutdown
  4. leetcode--两数之和--python
  5. 【ASP.NET Core】解决“The required antiforgery cookie xxx is not present”的错误
  6. 泛型中? super T和? extends T的区别
  7. POM.xml 标签详解
  8. CentOS 7 yum 安装 MySQL5.7
  9. Mac下配置Maven
  10. 百度搜索查询命令——组合型