深入了解Mvc路由系统
请求一个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路由系统的更多相关文章
- asp.net MVC 路由系统
ASP.NET的路由系统是基于物理文件的路由注册,通过调用System.Routing.RouteTable的Routes(RouteCollection)属性的MapPageRoute()方法来完成 ...
- ASP.NET MVC 路由系统类
RouteData public class RouteData { private RouteValueDictionary _dataTokens; private IRouteHandler _ ...
- MVC5路由系统机制详细讲解
请求一个ASP.NET mvc的网站和以前的web form是有区别的,ASP.NET MVC框架内部给我们提供了路由机制,当IIS接受到一个请求时,会先看是否请求了一个静态资源(.html,css, ...
- asp.net MVC 路由机制
1:ASP.NET的路由机制主要有两种用途: -->1:匹配请求的Url,将这些请求映射到控制器 -->2:选择一个匹配的路由,构造出一个Url 2:ASP.NET路由机制与URL重写的区 ...
- asp.net MVC 路由机制 Route
1:ASP.NET的路由机制主要有两种用途: -->1:匹配请求的Url,将这些请求映射到控制器 -->2:选择一个匹配的路由,构造出一个Url 2:ASP.NET路由机制与URL重写的区 ...
- asp.net中的路由系统
ASP.NET MVC重写了ASP.NET管道HttpModule和处理程序HttpHandler.MVC自定义了MvcHandler实现了Controller的激活和Action的执行.但是在请求到 ...
- ASP.NET MVC5路由系统机制详细讲解
请求一个ASP.NET mvc的网站和以前的web form是有区别的,ASP.NET MVC框架内部给我们提供了路由机制,当IIS接受到一个请求时,会先看是否请求了一个静态资源(.html,css, ...
- asp.net Mvc 路由详解,非常详细.
关于路由的理解 为什么要定义路由?路由的定义在开发中的工作量非常小,但是非常重要,因为任何请求都离不开路由. 各个电商网站的 URL 使用非常灵活,都离不开路由的定义,请大家参考几家电商的 URL 如 ...
- 探索ASP.NET MVC框架之路由系统
引言 对于ASP.NET MVC的路由系统相信大家肯定不陌生.今天我们就深入ASP.NET的框架内部来看一下路由系统到底是怎么通过我们给出的地址(例如:/Home/Index)解析出Controlle ...
随机推荐
- Java集合系列:-----------08HashMap的底层实现
对于HashMap感觉一直是看了忘,忘了看.这里就单独写一篇日志来记录一下.HashMap的底层实现. 非常好的讲HashMap的博客:http://blog.csdn.net/vking_wang/ ...
- Android 编译命令 make j8 2>&1 | tee build.log 解释
在编译Android的时候,经常看到这样的命令 make -j8 2>&1 | tee build.log 其中 make 是编译命令, -j8 这里的 8 指的是线程数量,就是你要 ...
- Python 操作 MongoDB
原文 这篇文章主要介绍了使用Python脚本操作MongoDB的教程,MongoDB作为非关系型数据库得到了很大的宣传力度,而市面上的教程一般都是讲解JavaScript的脚本操作,本文则是基于Pyt ...
- PRML读书会第十章 Approximate Inference(近似推断,变分推断,KL散度,平均场, Mean Field )
主讲人 戴玮 (新浪微博: @戴玮_CASIA) Wilbur_中博(1954123) 20:02:04 我们在前面看到,概率推断的核心任务就是计算某分布下的某个函数的期望.或者计算边缘概率分布.条件 ...
- 页面跳转Transfer与Redirect的区别你知道吗?
一 前言 关于页面跳转的方式常用的应该就是,链接跳转,js跳转,Server.Tranfser和Response.Redirect 这几种,可是在Tranfser与Redirect之间用哪种更好(本文 ...
- flex弹性布局学习笔记
前言 资料来源于网络,本人只是对此作了一下操作,记录于此以便以后查阅.目的在于梳理自己前端凌乱的知识点. 本文根据 Brian Franco 的一个flexbox.scss库来记录 入职新公司前对移动 ...
- Bootstrap系列 -- 4. 文本内容强调
一. 文本强调基本样式 .text-muted:提示,使用浅灰色(#999) .text-primary:主要,使用蓝色(#428bca) .text-success:成功,使用浅绿色(#3c763d ...
- unittest使用过程中sys.exit(not self.result.wasSuccessful())
起因: 在运行下面的unittest过程中出现了个Traceback: 被测试脚本: # splitter.py def split(line, types=None, delimiter=None) ...
- Linux下sysstat工具学习
Linux下,我们多用ssh链接服务器远程操控.对于系统的监控必不可少,sysstat很不错的监控工具包. sysstat官网:http://sebastien.godard.pagesperso-o ...
- MapReduce编程示例
1.将hadoop插件放入eclipse/plugins目录中 2.eclipse配置hadoop 依赖包目录 Window—Preferences 3.新建Map/Reduce Project项目 ...