一、為什么需要路由優(yōu)先級
大家都知道我們在Asp.Net MVC項目或WebApi項目中注冊路由是沒有優(yōu)先級的,當項目比較大、或有多個區(qū)域、或多個Web項目、或采用插件式框架開發(fā)時,我們的路由注冊很可能 不是寫在一個文件中的,而是分散在很多不同項目的文件中,這樣一來,路由的優(yōu)先級的問題就突顯出來了。
比如: App_Start/RouteConfig.cs中
routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); Areas/Admin/AdminAreaRegistration.cs中 context.MapRoute( name: "Login", url: "login", defaults: new { area = "Admin", controller = "Account", action = "Login", id = UrlParameter.Optional }, namespaces: new string[] { "Wenku.Admin.Controllers" } ); 假如是先注冊上面那個通用的default路由,再注冊這個login的路由,那么無論怎么樣,都會先匹配第一個滿足條件的路由,也就是第兩個路由注冊是無效的。
造成這個問題的原因就是這兩個路由注冊的順序問題,而Asp.Net MVC及WebApi中注冊路由都沒有優(yōu)先級這個概念,所以今天我們就是要自己實現(xiàn)這個想法,在注冊路由時加入一個優(yōu)先級的概念。
二、解決思路
1、先分析路由注冊的入口,比如我們新建一個mvc4.0的項目
public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); } } Mvc路由的注冊入口有兩個:
a. AreaRegistration.RegisterAllAreas(); 注冊區(qū)域路由
b. RouteConfig.RegisterRoutes(RouteTable.Routes); 注冊項目路由
WebApi路由注冊入口有一個:
WebApiConfig.Register(GlobalConfiguration.Configuration); 注冊WebApi路由
2、注冊路由的處理類分析
AreaRegistrationContext
RouteCollection
HttpRouteCollection
注冊路由時主要是由這三個類來注冊處理路由的。
3、路由優(yōu)先級方案
a、更改路由的注冊入口
b、自定義一個路由的結(jié)構(gòu)類RoutePriority及HttpRoutePriority,這兩個類下面都有Priority這個屬性
c、自定一個RegistrationContext來注冊路由,注冊的對象為上述自定義路由。
d、所有的路由注冊完成之后再按優(yōu)先順序添加到RouteCollection及HttpRouteCollection中實際生效。
新聞熱點
疑難解答
圖片精選