在實(shí)施路由攔截之前磕洪,通過下圖先了解當(dāng)請(qǐng)求到達(dá)Mvc程序后數(shù)據(jù)如何在管道中流動(dòng):
此過程將分為三步:
1.通過繼承“RouteBase”來自定義用于我們自己的Route:
public class CustomRout : RouteBase
{
//白名單集合
List<string> hosts = new List<string>()
public override RouteData GetRouteData(HttpContextBase httpContext)
{
//通過“UserAgent”判斷瀏覽器版本實(shí)施攔截
//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
{
//跳轉(zhuǎn)到指定頁面
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;
}
}
注:下圖是通過反編譯源代碼后鸵荠,框架里創(chuàng)建Route方式,因此可以借鑒來創(chuàng)建自己的Route
2.將自定義Route在“RouteConfig.cs”文件中進(jìn)行注冊(cè):
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes) //配置路由
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); //忽略路由
routes.Add("chrome", new CustomRout());
routes.MapRoute( //常規(guī)路由
url: "{controller}/{action}/{id}",
name: "Default", //路由名稱 被作為路由集合的Key this[int index] 不能重復(fù)
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
3.Route匹配:
注:通過上面的代碼將Route注冊(cè)到RouteCollection集合中去后榕订,框架會(huì)遍歷該集合,一旦找到匹配Route蜕便,立即返回劫恒。