深入了解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 ...
随机推荐
- TP框架中用tp模版迁移smarty模版的注意事项
ThinkPHP使用Smarty模板引擎的流程及注意事项在多人合作的项目中,Smarty模板使用的最多,具体原因百度. 而ThinkPHP中默认使用的模板是Think自己的模板,这就需要修改默认的模板 ...
- poj1190
生日蛋糕 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 18230 Accepted: 6491 Description 7月1 ...
- BZOJ 4241 历史研究
Description IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件. ...
- windows mysql提示:1045 access denied for user 'root'@'localhost' using password yes 解决方案
win7 MySql5.6.17提示:1045 access denied for user 'root'@'localhost' using password yes 从网上找到的解决方法,以此博客 ...
- jQuery 之 Callback 实现
在 js 开发中,由于没有多线程,经常会遇到回调这个概念,比如说,在 ready 函数中注册回调函数,注册元素的事件处理等等.在比较复杂的场景下,当一个事件发生的时候,可能需要同时执行多个回调方法,可 ...
- 项目分享五:H5图片压缩与上传
一.简介 图片的压缩与上传,是APP里一个很常用的功能.我们来年看 ChiTuStore 是怎样做的.相关文件 App/Module/User/UserInfo.html,App/Module/Use ...
- NDK开发之javaVM
1.关于JNIEnv和JavaVM JNIEnv是一个与线程相关的变量,不同线程的JNIEnv彼此独立.JavaVM是虚拟机在JNI层的代表,在一个虚拟机进程中只有一个JavaVM,因此该进程的所有线 ...
- [BZOJ2730][HNOI2012]矿场搭建(求割点)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2730 分析: 如果坍塌的点不是割点,那没什么影响,主要考虑坍塌的点是割点的情况. 显然 ...
- jvm中的动态分派
动态分派与复写密不可分,因为java中存在向上转型,这样就涉及到方法的调用问题.先看一下示例代码 package com.dy.xidian; class Test1 { public void sa ...
- STL数组处理常用函数
reverse(a,a+n)反转 sort(a,a+n,cmp)排序 unique(a,a+n,cmp)对于有序集合进行去重,返回新数组最后一个元素的指针 next_permutatoin(a,a+n ...