前言
本文的目的是利用Mvc route創建一個自定義約束來控制路由跳轉實現禁止ip登陸,當然例子可能不合理,但是文章要表明的意思是當普通的路由約束不能解決我們實際的需求時,我們可以通過自定義路由限制條件實現,比如當匹配路由有數據庫交互,根據url跳轉等實際需求時,使用自定義條件此問題便可迎刃而解。
實現
舉例普通的路由約束:
routes.MapRoute( "Product", "Product/{productId}", new {controller="Product", action="Details"}, new {productId = @"\d+" } );
匹配包含一個的整數productId的URLs。當定義一個route時,我們能夠使用一個限制條件來限制URLs,使它匹配這個route。在例子中,這個route包含一個只匹配整數的正則表達式約束。
這里匹配一個整數的productId,當不滿足這個條件是將交由另一個route處理,或者,如果沒有匹配的routes, “The resource could not be found ”錯誤將被返回,普通的路由約束可以完成一些簡單的沒有業務邏輯的路由限制,比如限制某IP用戶訪問等,下面的自定義約束就是來解決這個問題。
自定義條件約束:
下面來看一些System.Web.Route給我們提供的自定義約束的接口IRouteConstraint,定義如下:
// 摘要: // 定義類必須實現才能檢查某 URL 參數值是否對約束有效的協定。 [TypeForwardedFrom("System.Web.Routing, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")] public interface IRouteConstraint { // 摘要: // 確定 URL 參數是否包含此約束的有效值。 // // 參數: // httpContext: // 一個對象,封裝有關 HTTP 請求的信息。 // // route: // 此約束所屬的對象。 // // parameterName: // 正在檢查的參數的名稱。 // // values: // 一個包含 URL 的參數的對象。 // // routeDirection: // 一個對象,指示在處理傳入請求或生成 URL 時,是否正在執行約束檢查。 // // 返回結果: // 如果 URL 參數包含有效值,則為 true;否則為 false。 bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection); }
我們只要寫一個自定義約束類來實現此接口的Math方法,它返回一個布爾值。這個布爾值決定該請求是否應該被route對象處理。
下面我們來定義自定義路由約束:
public class AbandonConstraint : IRouteConstraint { public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) { var currentIp = httpContext.Request.UserHostAddress; //如果當前訪問用戶的ip是127.0.0.1,則匹配Abandon路由,如果不是則匹配其他路由 return currentIp == "127.0.0.1"; } }
路由設置:
routes.MapRoute( name: "Abandon", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Abandon", id = UrlParameter.Optional }, constraints:new { customConstraint = new AbandonConstraint() }//自定義限制路由 ); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } );
配置好以后,我們本地運行程序,便能匹配到Abandon路由,若我們修改所要限制的ip地址,則匹配Default路由。如下圖本地運行命中abandon默認地址的action
總結:
自定義的路由約束在實際應用中對於復雜的路由匹配條件,比如有數據庫交互,提供了便利的使用條件,同時當請求與自定義路由約束匹配時我們還可以動態為其添加,修改路由參數,控制跳轉等操作,注意約束條件必須繼承IRouteConstraint,並且實現Match方法。
時間倉促,代碼及文章比較雜亂,有什么出錯的地方歡迎指出。