MVC路由 路由的三种扩展 替换MVC内置的Handler

Global.asax 是 程序入口文件 

路由配置   为什么localhost:8088/Home/Index/1 能返问到我们写的   

     会去掉前缀跟端口号  变成Home/Index/1 用这个跟路由规则进行匹配

 **************路由扩展的三大层面

1. 直接用routers.MapRoute进行扩展   (这里定义的规则在源码中就是生成一个Route)

2. 扩展Route

    2.1 创建一个扩展规则 添加到RouteData中  这个对象就是存放的路由规则   

      只要发起请求的浏览器版本为这个的  给他指定路由规则

    public class MyRoute : RouteBase
    {
        public override RouteData GetRouteData(HttpContextBase httpContext)
        {
            if (httpContext.Request.UserAgent.IndexOf("Chrome71.0.3578.98") >= 0)
            {
                RouteData rd = new RouteData(this, new MvcRouteHandler());
                rd.Values.Add("controller", "Jcb");
                rd.Values.Add("action", "Index");
                return rd;
            }
            return null;
        }

        public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
        {
            //这里要改成返回null  不然会报错
            return null;
        }
    }

  2.2在RouteConfig中把对象添加到RouteCollection中

    /// <summary>
    /// 路由配置
    /// </summary>
    public class RouteConfig
    {
        public static void RegisterMyRoutes(RouteCollection routes)
        {
            routes.Add(new MyRoute());
        }

  2.3在Globl启动配置中注册路由

        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();//注册区域路由
            GlobalConfiguration.Configure(WebApiConfig.Register);//注册webapi路由
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);//

            RouteConfig.RegisterMyMVCHandler(RouteTable.Routes);
            RouteConfig.RegisterMyRoutes(RouteTable.Routes);
            RouteConfig.RegisterRoutes(RouteTable.Routes);//注册路由
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            ControllerBuilder.Current.SetControllerFactory(new UnityControllerFactory());//替换默认的控制器工厂

            //IOCConfig.InitIOCContainer();
        }

3.扩展Handler 替换掉MVC框架中的MVCHandler

  3.1.配置扩展的Handler

      只要访问的地址 控制器是Jcb 就使用自定义的Handler来处理这次请求   之间不用MVC内置的Handler

    /// <summary>
    /// 扩展IRouteHandler,
    /// 扩展IHttpHandler
    /// </summary>
    public class ElevenRouteHandler : IRouteHandler
    {
        public IHttpHandler GetHttpHandler(RequestContext requestContext)
        {
            return new ElevenHttpHandler(requestContext);
        }
    }

    /// <summary>
    /// 还是我们熟悉的handler
    /// </summary>
    public class ElevenHttpHandler : IHttpHandler
    {
        public ElevenHttpHandler(RequestContext requestContext)
        {
            Console.WriteLine("构造我的Handler");
        }

        public void ProcessRequest(HttpContext context)
        {
            string url = context.Request.Url.AbsoluteUri;
            context.Response.Write(string.Format("这里是我的定制:{0}", this.GetType().Name));
            context.Response.Write((string.Format("当前地址为:{0}", url)));

            context.Response.End();
        }

        public virtual bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }

  3.2.在RouteConfig配置中添加

        public static void RegisterMyMVCHandler(RouteCollection routes)
        {
            routes.Add(new Route("Jcb/{*Info}", new ElevenRouteHandler()
                ));
        }

  3.3在Globl中注册

        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();//注册区域路由
            GlobalConfiguration.Configure(WebApiConfig.Register);//注册webapi路由
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);//

            RouteConfig.RegisterMyMVCHandler(RouteTable.Routes);
            RouteConfig.RegisterMyRoutes(RouteTable.Routes);
            RouteConfig.RegisterRoutes(RouteTable.Routes);//注册路由
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            ControllerBuilder.Current.SetControllerFactory(new UnityControllerFactory());//替换默认的控制器工厂

            //IOCConfig.InitIOCContainer();
        }
原文地址:https://www.cnblogs.com/jiangchengbiao/p/10222183.html