第十四节:再探MVC中路由的奥秘
一. 基于RouteBase扩展
1. 原理
扩展RouteBase,同样使用的是MVC框架提供的MvcRouteHandler进行处理。
2. 步骤
1. 新建YpfRoute1类,继承RouteBase类型,并覆写里面的两个抽象方法, 在GetRouteData编写业务逻辑,(这里是禁止Chrome浏览器访问),通过RouteData添加地址,并返回。
/// <summary>
/// 基于RouteBase进行扩展
/// </summary>
public class YpfRoute1 : RouteBase
{
/// <summary>
/// 解析路由信息
/// </summary>
/// <param name="httpContext"></param>
/// <returns></returns>
public override RouteData GetRouteData(HttpContextBase httpContext)
{
//编写自己业务逻辑(这里禁止Chrome浏览器的访问 不是很准确)
if (httpContext.Request.UserAgent.IndexOf("Chrome")>=)
{
//返回指定的页面
RouteData rd = new RouteData(this, new MvcRouteHandler());
rd.Values.Add("controller","Route");
rd.Values.Add("action", "RefuseView");
return rd;
} return null;
} /// <summary>
/// 指定虚拟路径处理(这里暂不使用)
/// </summary>
/// <param name="requestContext"></param>
/// <param name="values"></param>
/// <returns></returns>
public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
throw new NotImplementedException();
}
}
2. 在RouteConfig文件中新建RefuseChrome方法,并在该方法中添加YpfRoute1类。
/// <summary>
/// 基于RouteBase进行扩展的路由
/// </summary>
/// <param name="route"></param>
public static void RefuseChrome(RouteCollection route)
{
route.Add("myRoute", new YpfRoute1());
}
3. 在Global中将RefuseChrome方法注册进去。
注意:是放到系统自带路由注册的上面还是下面,哪个在上,哪个先执行。

4. 测试
使用Chrome浏览器打开任何页面,均跳转到拒绝访问页面。

二. 基于IRouteHandler扩展
1. 原理
扩展IRouteHandler并且自定义IHttpHandler 。
2. 步骤
1. 新建YpfRoute1类,实现接口IRouteHandler,并实现里面的GetHttpHandler方法。
2. 自定义ypfHttpHandler类,并实现IhttpHandler接口。
/// <summary>
/// 扩展IRouteHandler和自定义IHttpHandler
/// </summary>
public class YpfRoute2 : IRouteHandler
{
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
return new ypfHttpHandler();
}
} public class ypfHttpHandler : IHttpHandler
{ bool IHttpHandler.IsReusable
{
get
{
return false;
}
} void IHttpHandler.ProcessRequest(HttpContext context)
{
string url = context.Request.Url.AbsoluteUri;
context.Response.Write(string.Format("这里是ypf定制:{0}", this.GetType().Name));
context.Response.Write((string.Format("当前地址为:{0}", url))); context.Response.End();
}
}
3. 在RouteConfig文件中新建RegisterSpecialRoute方法,并在该方法中添加YpfRoute1类(注册规则,并使用RouteTable往里添加)
/// <summary>
/// 扩展IRouteHandler和自定义IHttpHandler
/// </summary>
/// <param name="routes"></param>
public static void RegisterSpecialRoute(RouteCollection routes)
{
Route route = new Route("Ypf/{other}",new YpfRoute2());
RouteTable.Routes.Add(route);
}
4. 在Global中将RefuseChrome方法注册进去,注意:是放到系统自带路由注册的上面还是下面,哪个在上, 哪个先执行。

5. 访问地址:http://localhost:7559/Ypf/1 ,统一跳转到指定页面显示指定的信息(地址中的 1 可以换成任何信息)


第十四节:再探MVC中路由的奥秘的更多相关文章
- 大白话5分钟带你走进人工智能-第十四节过拟合解决手段L1和L2正则
第十四节过拟合解决手段L1和L2正则 第十三节中, ...
- 《Entity Framework 6 Recipes》中文翻译系列 (20) -----第四章 ASP.NET MVC中使用实体框架之在MVC中构建一个CRUD示例
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第四章 ASP.NET MVC中使用实体框架 ASP.NET是一个免费的Web框架 ...
- 第三百二十四节,web爬虫,scrapy模块介绍与使用
第三百二十四节,web爬虫,scrapy模块介绍与使用 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了 ...
- centos Linux系统日常管理1 cpuinfo cpu核数 命令 w, vmstat, uptime ,top ,kill ,ps ,free,netstat ,sar, ulimit ,lsof ,pidof 第十四节课
centos Linux系统日常管理1 cpuinfo cpu核数 命令 w, vmstat, uptime ,top ,kill ,ps ,free,netstat ,sar, ulimit ...
- 风炫安全WEB安全学习第二十四节课 利用XSS钓鱼攻击
风炫安全WEB安全学习第二十四节课 利用XSS钓鱼攻击 XSS钓鱼攻击 HTTP Basic Authentication认证 大家在登录网站的时候,大部分时候是通过一个表单提交登录信息. 但是有时候 ...
- 第三百八十四节,Django+Xadmin打造上线标准的在线教育平台—路由映射与静态文件配置以及会员注册
第三百八十四节,Django+Xadmin打造上线标准的在线教育平台—路由映射与静态文件配置以及会员注册 基于类的路由映射 from django.conf.urls import url, incl ...
- 第三百七十四节,Django+Xadmin打造上线标准的在线教育平台—创建课程app,在models.py文件生成4张表,课程表、课程章节表、课程视频表、课程资源表
第三百七十四节,Django+Xadmin打造上线标准的在线教育平台—创建课程app,在models.py文件生成4张表,课程表.课程章节表.课程视频表.课程资源表 创建名称为app_courses的 ...
- 第三百六十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的mapping映射管理
第三百六十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的mapping映射管理 1.映射(mapping)介绍 映射:创建索引的时候,可以预先定义字 ...
- 第三百五十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—数据收集(Stats Collection)
第三百五十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—数据收集(Stats Collection) Scrapy提供了方便的收集数据的机制.数据以key/value方式存储,值大多是计数 ...
随机推荐
- 英语口语练习系列-C02-抱怨
连接到英语口语系列总分类 连接到上一章棒棒的 竹石 郑燮 zhèng xiè 竹石 作者:郑燮 咬定青山不放松,立根原在破岩中. 千磨万击还坚劲,任尔东西南北风. Our team sucks. 我们 ...
- 【入门】Spring-Boot项目配置Mysql数据库
前言 前面参照SpringBoot官网,自动生成了简单项目点击打开链接 配置数据库和代码遇到的问题 问题1:cannot load driver class :com.mysql.jdbc.Drive ...
- 初识shell编程
1.shell编程之为什么学.怎么学 为什么学shell编程 Linux系统批量管理 提升工作效率,减少重复工作 学好shell编程所需要的基础知识 熟悉使用vim编辑器 熟悉SSH终端 熟练掌握Li ...
- 文本分类实战(七)—— Adversarial LSTM模型
1 大纲概述 文本分类这个系列将会有十篇左右,包括基于word2vec预训练的文本分类,与及基于最新的预训练模型(ELMo,BERT等)的文本分类.总共有以下系列: word2vec预训练词向量 te ...
- JS正则四个反斜杠的含义
我们首先来看如下代码,在浏览器中输出的是什么? // 在浏览器中输出的 console.log('\\'); // 输出 \ console.log('\\\\'); // 输出 \\ 一:js正则直 ...
- Codeforces Round 1153(div. 2)
这场奇差.ABCD四题.179名. 但是E在现场有213个人做出. 描述一下我在35分钟做完D后的心路历程. 首先看到这道E,第一下想到的是把所有的横向和竖向的整列(行)求出相连的个数. 然后想如何能 ...
- Linux中断管理
CPU和外设之间的交互,或CPU通过轮询机制查询,或外设通过中断机制主动上报. 对大部分外设中断比轮询效率高,但比如网卡驱动采取轮询比中断效率高. 这里重点关注ARM+Linux组合下中断管理,从底层 ...
- vue-使用keep-alive优化网页性能
export default{ name: 'Home', data () { return { iconList: [], recommendList: [], swiperList: [], we ...
- 领域驱动设计系列文章(2)——浅析VO、DTO、DO、PO的概念、区别和用处
本篇文章主要讨论一下我们经常会用到的一些对象:VO.DTO.DO和PO. 由于不同的项目和开发人员有不同的命名习惯,这里我首先对上述的概念进行一个简单描述,名字只是个标识,我们重点关注其概念: 概念: ...
- 再看ExpressionTree,Emit,反射创建对象性能对比
[前言] 前几日心血来潮想研究着做一个Spring框架,自然地就涉及到了Ioc容器对象创建的问题,研究怎么高性能地创建一个对象.第一联想到了Emit,兴致冲冲写了个Emit创建对象的工厂.在做性能测试 ...