在实施路由拦截之前,通过下图先了解当请求到达Mvc程序后数据如何在管道中流动:
![](https://img.haomeiwen.com/i24241886/7102547a76d8f45a.png)
此过程将分为三步:
1.通过继承“RouteBase”来自定义用于我们自己的Route:
public class CustomRout : RouteBase
{
//白名单集合
List<string> hosts = new List<string>()
public override RouteData GetRouteData(HttpContextBase httpContext)
{
//通过“UserAgent”判断浏览器版本实施拦截
//if (httpContext.Request.UserAgent.Contains("Mozilla/5.0 (Windows NT 10.0; Win64; x64)"))
//{
//return null;
//}
if (hosts.FindIndex(h => h == httpContext.Request.Url.Host) > 0)
{
//不做拦截处理
return null;
}
else
{
//跳转到指定页面
var routData = new RouteData(this, new MvcRouteHandler());
routData.Values.Add("controller", "Pipe");
routData.Values.Add("action", "Refuse");
return routData;
}
}
public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
return null;
}
}
注:下图是通过反编译源代码后,框架里创建Route方式,因此可以借鉴来创建自己的Route
![](https://img.haomeiwen.com/i24241886/67223c05f0a150a9.png)
2.将自定义Route在“RouteConfig.cs”文件中进行注册:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes) //配置路由
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); //忽略路由
routes.Add("chrome", new CustomRout());
routes.MapRoute( //常规路由
url: "{controller}/{action}/{id}",
name: "Default", //路由名称 被作为路由集合的Key this[int index] 不能重复
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
3.Route匹配:
![](https://img.haomeiwen.com/i24241886/947d4d5918c8c8dd.png)
注:通过上面的代码将Route注册到RouteCollection集合中去后,框架会遍历该集合,一旦找到匹配Route,立即返回。
网友评论