当前位置: 首页 > 编程日记 > 正文

深入了解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){//假如我们定义 如果是谷歌用户则命中路由当前路由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

相关文章:

uni-app h5页面左上角出现“取消“字眼解决办法

在项目根目录的index.html中加上一行代码 <link rel"stylesheet" href"<% BASE_URL %>static/index.<% VUE_APP_INDEX_CSS_HASH %>.css" /> 如图&#xff1a;

unity编辑器扩展_01(在工具栏中创建一个按钮)

代码&#xff1a; [MenuItem("Tools/Test",false,1)] static void Test() { Debug.Log("test"); } 注意&#xff1a;MenuItem中第一个参数:需要创建选项在工具栏中的路径&#xff0c;此路径的父目录可以是Unity中已存在的&#xff0c;也…

postgres语法_SQL Create Table解释了MySQL和Postgres的语法示例

postgres语法A table is a group of data stored in a database.表是存储在数据库中的一组数据。 To create a table in a database you use the CREATE TABLE statement. You give a name to the table and a list of columns with its datatypes.要在数据库中创建表&#…

jquery-ajax请求:超时设置,增加 loading 提升体验

前端发送Ajax请求到服务器&#xff0c;服务器返回数据这一过程&#xff0c;因原因不同耗时长短也有差别&#xff0c;且这段时间内页面显示空白。如何优化这段时间内的交互体验&#xff0c;以及长时间内服务器仍未返回数据这一问题&#xff0c;是我们开发中不容忽视的重点。 常见…

第三章.SQL编程

2016年3月2日13:55:17(记忆笔记) 变量是存储数据的容器。 如何在SQL中定义自己的变量&#xff01; First:第一套变量定义 整型 Declare num int Set num10 Print num 第二套变量定义 字符串类型(char varchar nvarchar) Declare name nvarchar(32) Set name’小帅’ Pri…

移动端自动播放音视频实现代码

视频组件 <video :custom-cache"false" :src"item.voideoUrl" :id"audio index" :vslide-gesture-in-fullscreen"false" :direction0 :enable-progress-gesture"false" :show-fullscreen-btn"false" loop obj…

grafana美人鱼_编码美人鱼–我如何从海洋生物学家转到前端开发人员

grafana美人鱼I have wanted to share my story for a while, but I didn’t know exactly how to start, or even what name to give it. 我想分享我的故事一段时间&#xff0c;但我不知道确切的开头&#xff0c;甚至不知道用什么名字。 But recently I was talking with som…

网络安全基础扫盲

1. 名词解释 APT 高级持续性威胁。利用先进的攻击手段对特定目标进行长期持续性网络攻击的攻击形式。其高级性主要体现在APT在发动攻击之前需要对攻击对象的业务流程和目标系统进行精确的收集。 VPN 虚拟专用网络&#xff08;Virtual private network&#xff09; VPN是Virtual…

Install Package and Software

svn http://tortoisesvn.sourceforge.net/ git https://download.tortoisegit.org/ http://git-for-windows.github.io/转载于:https://www.cnblogs.com/exmyth/p/5246529.html

小程序保存网络图片

小程序保存网络实现流程&#xff1a; 1.把图片下载到本地 2.检查用户的授权状态&#xff08;三种状态&#xff1a;未授权&#xff0c;已授权&#xff0c;未同意授权&#xff09;&#xff0c;判断是否授权保存图片的能力&#xff0c;如果是用户点击了不同意授权给小程序保存图…

aws 认证_引入#AWSCertified挑战:您的第一个AWS认证之路

aws 认证You may already know that Amazon Web Services (AWS) is the largest, oldest, and most popular cloud service provider. But did you know they offer professional certifications, too?您可能已经知道Amazon Web Services(AWS)是最大&#xff0c;最古老和最受欢…

node!!!

node.js Node是搞后端的&#xff0c;不应该被被归为前端&#xff0c;更不应该用前端的观点去理解&#xff0c;去面试node开发人员。所以这份面试题大全&#xff0c;更侧重后端应用与对Node核心的理解。 github地址: https://github.com/jimuyouyou/node-interview-questions 注…

POJ 1556 The Doors(计算几何+最短路)

这题就是&#xff0c;处理出没两个点。假设能够到达&#xff0c;就连一条边&#xff0c;推断可不能够到达&#xff0c;利用线段相交去推断就可以。最后求个最短路就可以 代码&#xff1a; #include <cstdio> #include <cstring> #include <algorithm> #inclu…

* core-js/modules/es6.array.fill in ./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref

运行Vue项目报错&#xff0c;报错截图如下&#xff1a; 导致该错误的原因是core-js版本不对&#xff1a; 解决方法&#xff1a;安装淘宝镜像 $ cnpm install core-js2 安装完成重新运行就可以了 外&#xff1a; 清除npm缓存命令 &#xff1a; npm cache clean -f

github创建静态页面_如何在10分钟内使用GitHub Pages创建免费的静态站点

github创建静态页面Static sites have become all the rage, and with good reason – they are blazingly fast and, with an ever growing number of supported hosting services, pretty easy to set up. 静态站点已成为流行&#xff0c;并且有充分的理由-它们非常快速&…

小程序生成网址链接,网址链接跳转小程序

登录小程序后台&#xff0c;点击右上角的工具&#xff0c;生成小程序URL Scheme &#xff0c; 可以得出一个 weixin://dl/business/?tbAXXXXX 这样的链接&#xff0c;点击就可以调整到小程序拉&#xff0c;但是这种只能在微信打开哦。

appium-chromedriver@3.0.1 npm ERR! code ELIFECYCLE npm ERR! errno 1

解决方法&#xff1a; npm install appium-chromedriver3.0.1 --ignore-scripts 或者&#xff08;安装方法&#xff09;&#xff1a; npm install appium-chromedriver --chromedriver_cdnurlhttp://npm.taobao.org/mirrors/chromedriver 官网地址&#xff1a;https://www.npmj…

linux下QT Creator常见错误及解决办法

最近因为在做一个关于linux下计算机取证的小项目&#xff0c;需要写一个图形界面&#xff0c;所以想到了用QT来写&#xff0c;选用了linux下的集成开发环境QT Creator5.5.1&#xff0c;但刚刚安装好&#xff0c;竟然连一个"hello world"的样例都跑不起来&#xff0c;…

如何使用JavaScript Math.floor生成范围内的随机整数-已解决

快速解决方案 (Quick Solution) function randomRange(myMin, myMax) {return Math.floor(Math.random() * (myMax - myMin 1) myMin); }代码说明 (Code Explanation) Math.random() generates our random number between 0 and ≈ 0.9. Math.random()生成介于0和≈0.9之间的…

小白的未来与展望

新的起点&#xff0c;新的挑战与机遇 1.在php制作&#xff0c;研发上的知识点及语法编辑重点要按照老师的要求完全掌握。作为对自己以后前进方向上坚实的基础。 2.php语言开发编写上&#xff0c;希望能够在不久的将来能够有自己的独特的理解及研发出更多的更为简洁方便的编写方…

uniapp移动端H5在线预览PDF等文件实现源码及注解

uniapp移动端H5预览文件实现分为两个场景处理: (这里以预览PDF文件为示例,在线预览就是查看网络文件) 1. IOS客户端预览PDF文件 IOS客户端预览PDF文件可以通过跳转文件地址实现预览,因为苹果手机的浏览器自带阅读器 2. 安卓客户端预览PDF文件 安卓客户端需要在源码添…

如何使用Python和Tkinter构建Toy Markdown编辑器

Markdown editors are trending these days. Everybody is creating a markdown editor, and some of them are innovative while some of them are boring. Markdown编辑器近来呈趋势。 每个人都在创建降价编辑器&#xff0c;其中有些人很创新&#xff0c;而有些人很无聊。 A…

Hadoop 分布式环境搭建

1.集群机器&#xff1a; 1台 装了 ubuntu 14.04的 台式机 1台 装了ubuntu 16.04 的 笔记本 &#xff08;机器更多时同样适用&#xff09; 搭建步骤&#xff1a; 准备工作&#xff1a; 使两台机器处于同一个局域网&#xff1a;相互能够 ping 通 主机名称 …

常见报错——Uncaught TypeError: document.getElementsByClassName(...).addEventListener is not a function...

这是因为选择器没有正确选择元素对象 document.getElementsByClassName(...)捕捉到的是该类名元素的数组 正确的访问方式应该是&#xff1a; document.getElementsByClassName(...)[0].addEventListener... 使用遍历为每个class添加监听&#xff1a; var classObj document.ge…

uniapp富文本兼容视频实现方案

使用 mp-html 富文本插件&#xff0c;就可以支持富文本内的视频播放。 安装&#xff1a; npm install mp-html 使用方法 <template><view><mp-html :content"html" /></view> </template> <script>import mpHtml from /comp…

循环神经网络 递归神经网络_如何用递归神经网络预测空气污染

循环神经网络 递归神经网络After the citizen science project of Curieuze Neuzen, I wanted to learn more about air pollution to see if I could make a data science project out of it. On the website of the European Environment Agency, you can find a huge amount…

mysql like 命中索引

反向索引案例&#xff1a;CREATE TABLE my_tab(x VARCHAR2(20)); INSERT INTO my_tab VALUES(abcde); COMMIT;CREATE INDEX my_tab_idx ON my_tab(REVERSE(x)); SELECT * FROM my_tab t WHERE REVERSE(t.x) LIKE REVERSE(%cde);//避免使用like时索引不起作用 修改反向索引为正…

CSS超出隐藏并且能滚动

效果图 实现CSS代码&#xff1a; height: 500rpx; overflow-x: hidden; overflow-y: scroll; 效果图的代码&#xff1a; <!-- 豆豆明细弹窗 --><view class"mxBoom" v-show"mxBoom"><view class"mxBoomContent"><view c…

Oracle学习之段区块初步概念

段&#xff1a;一张表可以视为一个段 区&#xff1a;Oracle 给段分配空间的最小单位&#xff0c;表建好后&#xff0c;Oracle就会给表分配物理上连续的空间&#xff0c;叫做区 块&#xff1a;Oracle IO的最小单位&#xff0c;buffer cache中缓存的是dbf文件&#xff0c;由于dbf…

github充当服务器_如何创建充当链接HTML按钮

github充当服务器Sometimes you may want to use a button to link to another page or website rather than to submit a form or something like that. This is fairly simple to do and can be achieved in several ways.有时&#xff0c;您可能希望使用按钮链接到另一个页面…