在实际的项目中,会存在大量的自定义路由,URL很容易被错误的路由捕获,现在我们就实现一个这样的诊断工具,该工具通过实现一个自定义的IHttpModule来实现。

首先,我们创建CustomRouteHandler:

    public class CustomRouteHandler : IRouteHandler{public IHttpHandler GetHttpHandler(RequestContext requestContext){if(HasQueryStringKey("routeInfo", requestContext.HttpContext.Request)){OutputRouteDiagnostics(requestContext.RouteData, requestContext.HttpContext);}var handler = new CustomMvcHandler(requestContext);            return handler;}private bool HasQueryStringKey(string keyToTest, HttpRequestBase request){return Regex.IsMatch(request.Url.Query, string.Format(@"^\?{0}$", keyToTest));}private void OutputRouteDiagnostics(RouteData routeData, HttpContextBase context){var response = context.Response;response.Write(@"<style>body {font-family: Arial;}table th {background-color: #359; color: #fff;}</style><h1>Route Data:</h1><table border='1' cellspacing='0' cellpadding='3'><tr><th>Key</th><th>Value</th></tr>");foreach (var pair in routeData.Values){response.Write(string.Format("<tr><td>{0}</td><td>{1}</td></tr>", pair.Key, pair.Value));}response.Write(@"</table><h1>Routes:</h1><table border='1' cellspacing='0' cellpadding='3'><tr><th></th><th>Route</th></tr>");bool foundRouteUsed = false;foreach(Route r in RouteTable.Routes){response.Write("<tr><td>");bool matches = r.GetRouteData(context) != null;string backgroundColor = matches ? "#bfb" : "#fbb";if(matches && !foundRouteUsed){response.Write("&raquo;");foundRouteUsed = true;    }response.Write(string.Format("</td><td style='font-family: Courier New; background-color:{0}'>{1}</td></tr>",backgroundColor, r.Url));                }response.End();}}

CustomRouteHandler中使用到了一个CustomMvcHandler,如下:

    public class CustomMvcHandler : MvcHandler{public CustomMvcHandler(RequestContext requestContext): base(requestContext){}protected override void ProcessRequest(HttpContext httpContext){try{base.ProcessRequest(httpContext);}catch (Exception exc){throw new ApplicationException("RouteUsed:" +RequestContext.RouteData.Route.GetVirtualPath(RequestContext, RequestContext.RouteData.Values), exc);}}}

其次,我们需要在MapRoute的时候指定CustomRouteHandler,如下:

            routes.MapRoute("Default", // Route name"Home/{action}/{id}", // URL with parametersnew { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults).RouteHandler = new CustomRouteHandler();

最终的结果,如果我们想要看当前URL的路由信息,则输入URL如:http://localhost:12205/Home?routeInfo,会显式如下:

MVC TIP7:自定义IHttpModule、IRouteHandler实现路由调试相关推荐

  1. MVC 控制器和 路由,及路由调试

    控制器 控制器三个职责: 1.处理跟用户的交互 2.处理业务逻辑的调用 3.指定具体的视图显示数据,并且把数据传递给视图 控制器约定: 1.必须是非静态类 2.必须实现IController接口 3. ...

  2. 用自定义IHttpModule实现URL重写

    在本人拙作<ASP.NET夜话>第十二章中探讨过ASP.NET底层运行机制的问题,在该书中本人也讲到过了解一些ASP.NET的低层机制对于我们灵活控制ASP.NET有很大帮助,在该书中本人 ...

  3. java自定义标签 map_基于Spring MVC的自定义标签Tag

    基于Spring MVC的自定义标签Tag 1.环境准备 本次小项目基于Spring MVC进行测试呈现,项目依赖的jar文件列表如下: 2.搭建SpringMVC Spring MVC环境最关键的两 ...

  4. java怎么设置404界面_如何使用Spring MVC显示自定义的404 Not Found页面

    本篇文章给大家带来的内容是关于如何使用Spring MVC显示自定义的404 Not Found页面,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 不知道大家对千篇一律的404 No ...

  5. 【译】Asp.net MVC 利用自定义RouteHandler来防止图片盗链 (转)

    你曾经注意过在你服务器请求日志中多了很多对图片资源的请求吗?这可能是有人在他们的网站中盗链了你的图片所致,这会占用你的服务器带宽.下面这种方法可以告诉你如何在ASP.NET MVC中实现一个自定义Ro ...

  6. ASP.NET Core MVC 源码学习:Routing 路由

    前言 最近打算抽时间看一下 ASP.NET Core MVC 的源码,特此把自己学习到的内容记录下来,也算是做个笔记吧. 路由作为 MVC 的基本部分,所以在学习 MVC 的其他源码之前还是先学习一下 ...

  7. VS Code 安装 Go 插件、自定义扩展配置、断点调试

    1. 安装插件 使用快捷键 Ctrl+Shift+X 打开插件安装页面,安装 Go 插件. 2. 自定义扩展配置 使用快捷键 Ctrl+, 打开自定义配置页,编辑 settings.json ,定义与 ...

  8. Flask自定义转换器,实现路由匹配正则表达式参数

    Flask框架动态路由实现参数传递和Django框架有类似之处,但是相比于Django框架,Flask实现复杂的参数就需要自己自定义转换器来实现了,而不能向Django那样直接使用正则表达式 1 # ...

  9. [ASP.NET MVC] 利用自定义的AuthenticationFilter实现Basic认证

    很多情况下目标Action方法都要求在一个安全上下文中被执行,这里所谓的安全上下文主要指的是当前请求者是一个经过授权的用户.授权的本质就是让用户在他许可的权限范围内做他能够做的事情,授权的前提是请求者 ...

最新文章

  1. 7小时上线1个秒杀系统!!!!
  2. 打造高效的工作环境 – SHELL 篇
  3. php文件显示不完整,github文件显示不全
  4. Oracle中Select语句完整的执行顺序
  5. Oracle数据字典全解 (1)
  6. css-modules,CSS Modules 方案
  7. [Android6.0] StageFright解码流程小结
  8. JavaWeb项目架构之FastDFS分布式文件系统
  9. 【R图秀】情人节快乐!
  10. 微信小程序图片上传java后台
  11. Arduino数据记录至Excel
  12. Excel表格身份证号码如何一键提取性别、年龄、出生年月
  13. oracle建表语句
  14. NLTK09《Python自然语言处理》code08 分析句子结构
  15. iOS——Segue的使用
  16. 读研规划,准研究生们看看哦!!!!!!!!!!!!!
  17. 东南亚外卖平台分析报告
  18. 测试用例设计与黑盒测试用例设计
  19. 大一作业:c语言,用static变量编写一个函数fac(int n),此函数连续调用n次,可以依次返回1至n的阶乘值。最后用main调用fac函数输出1-5的阶乘。
  20. 图像极坐标变换的研究

热门文章

  1. ijkplayer 视频播放
  2. JUnit5 @Disabled测试示例
  3. 在字符串中找出第一个只出现一次的字符
  4. gateway请求拦截_gateway 网关(转发,跨域,拦截器等)
  5. 互联网躺平学 ,从后端到前端有多吃香?
  6. 这10个实用的Javascript调试技巧,你知道吗?
  7. 实用调试技巧 Debug Release F10 F11 初始化 越界访问 堆栈 模拟实现库函数
  8. C语言操作符详解 隐式类型转换 (整型提升 算数转换)
  9. plc tcp ip通讯怎么只能连一个客户端_一款Ethernet/IP和Modbus TCP转OPC UA产品
  10. 假设计算机学院二年级,二年级计算机信息教案.doc