请求一个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)
        {
            //假如我们定义 如果是谷歌用户则命中路由当前路由
            )
            {
                RouteData rd= new RouteData(this, new MvcRouteHandler());
                //假设命中了此路由 解析获得请求控制器为Home action方法为Index
                rd.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)
        {
            )
            {
                context.Response.Write("当前是谷歌浏览器");
            }
            )
            {
                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方法为Index
                rd.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的处理逻辑的方法



 

深入了解Mvc路由系统的更多相关文章

  1. asp.net MVC 路由系统

    ASP.NET的路由系统是基于物理文件的路由注册,通过调用System.Routing.RouteTable的Routes(RouteCollection)属性的MapPageRoute()方法来完成 ...

  2. ASP.NET MVC 路由系统类

    RouteData public class RouteData { private RouteValueDictionary _dataTokens; private IRouteHandler _ ...

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

    请求一个ASP.NET mvc的网站和以前的web form是有区别的,ASP.NET MVC框架内部给我们提供了路由机制,当IIS接受到一个请求时,会先看是否请求了一个静态资源(.html,css, ...

  4. asp.net MVC 路由机制

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

  5. asp.net MVC 路由机制 Route

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

  6. asp.net中的路由系统

    ASP.NET MVC重写了ASP.NET管道HttpModule和处理程序HttpHandler.MVC自定义了MvcHandler实现了Controller的激活和Action的执行.但是在请求到 ...

  7. ASP.NET MVC5路由系统机制详细讲解

    请求一个ASP.NET mvc的网站和以前的web form是有区别的,ASP.NET MVC框架内部给我们提供了路由机制,当IIS接受到一个请求时,会先看是否请求了一个静态资源(.html,css, ...

  8. asp.net Mvc 路由详解,非常详细.

    关于路由的理解 为什么要定义路由?路由的定义在开发中的工作量非常小,但是非常重要,因为任何请求都离不开路由. 各个电商网站的 URL 使用非常灵活,都离不开路由的定义,请大家参考几家电商的 URL 如 ...

  9. 探索ASP.NET MVC框架之路由系统

    引言 对于ASP.NET MVC的路由系统相信大家肯定不陌生.今天我们就深入ASP.NET的框架内部来看一下路由系统到底是怎么通过我们给出的地址(例如:/Home/Index)解析出Controlle ...

随机推荐

  1. [转]PHP 下使用 ZeroMQ 和 protobuf

    FROM : http://www.68idc.cn/help/makewebs/php/20150118175432.html 前言 这个记录总的来说分两部分: 搭建环境. 简单使用教程. 搭建环境 ...

  2. Linux 退格键不回显

    在程序使用system("stty erase ^H");可以实现在输入状态下,按退格键删除字符,不回显. 调用tcsetattr修改linux基本输入的控制字符定义 //Linu ...

  3. codevs http://www.codevs.cn/problem/?problemset_id=1 循环、递归、stl复习题

    12.10高一练习题 1.要求: 这周回顾复习的内容是循环.递归.stl. 不要因为题目简单就放弃不做,现在就是练习基础. 2.练习题: (1)循环   题目解析与代码见随笔分类  NOI题库 htt ...

  4. 【深圳】OSC源创会第44期 开始报名

    时间:2016-03-19 14:00 地点: 深圳 南山区海德三道天利中央商务广场B座负一楼(意启创业) 费用:50元/人(现场交),女士.50积分的账号.开源软件作者.学生免费 (用于准备茶歇小食 ...

  5. WebService的两种方式SOAP和REST比较 (转)

    我的读后感:由于第一次接触WebService,对于很多概念不太理解,尤其是看到各个OpenAPI的不同提供方式时,更加疑惑.如google map api采用了AJAX方式,通过javascript ...

  6. react实现的tab切换组件

    我有点想要吐槽,因为用原生的js实现起来挺简单的一个小东西,改用react来写却花了我不少时间,也许react的写法只有在复杂的web应用中才能体现出它的优势吧!不过吐槽归吐槽,对react这种优雅的 ...

  7. 也来山寨一版Flappy Bird (js版)

    随着Flappy Bird的火爆,各种实现的版也不断出现,于是也手痒简单实现了一版. 其实本来只是想实现一下这只笨鸟的飞翔运动的,后来没忍住,就直接实现一个完整游戏了…… 因为这个游戏本身实现起来就没 ...

  8. Windows Phone 8 显示当前项目的使用内存,最大峰值,最大内存上限

    public static class MemoryDiagnosticsHelper { public static bool isStart = false; static Popup popup ...

  9. nios II--实验1——hello_world硬件部分

    hello_world 硬件开发 新建原理图 1.打开Quartus II 11.0,新建一个工程,File -> New Project Wizard…,忽略Introduction,之间单击 ...

  10. SVN 修改log信息报错的解决方案

    要实现允许修改log这个功能,只需要在hooks目录下增加一个名为:pre-revprop-change.bat的文件,重启svn即可.该文件内容为:------------------------- ...