共用方式為


建立自訂的路由條件約束 (C#)

作者:Stephen Walther

Stephen Walther 示範如何建立自訂路由條件約束。 我們會實作簡單的自訂條件約束,以防止從遠端電腦提出瀏覽器要求時比對路由。

此教學課程的目標是要示範如何建立自訂路由條件約束。 自訂路由條件約束可讓您防止路由比對,除非符合某些自訂條件。

在此教學課程中,我們會建立 Localhost 路由條件約束。 Localhost 路由條件約束只符合從本機電腦提出的要求。 來自網際網路的遠端要求不相符。

您可以實作 IRouteConstraint 介面來實作自訂路由條件約束。 這是描述單一方法的非常簡單的介面,:

bool Match(
    HttpContextBase httpContext,
    Route route,
    string parameterName,
    RouteValueDictionary values,
    RouteDirection routeDirection
)

方法會傳回布林值。 如果您傳回 false,與條件約束相關聯的路由不符合瀏覽器要求。

Localhost 條件約束包含在清單 1 中。

清單 1 - LocalhostConstraint.cs

using System.Web;
using System.Web.Routing;
namespace MvcApplication1.Constraints
{
    public class LocalhostConstraint : IRouteConstraint
    {
        public bool Match
            (
                HttpContextBase httpContext, 
                Route route, 
                string parameterName, 
                RouteValueDictionary values, 
                RouteDirection routeDirection
            )
        {
            return httpContext.Request.IsLocal;
        }
    }
}

清單 1 中的條件約束會利用 HttpRequest 類別所公開的 IsLocal 屬性。 當要求的 IP 位址是 127.0.0.1 或要求 IP 位址與伺服器的 IP 位址相同時,這個屬性會傳回 true。

您可以在 Global.asax 檔案中定義的路由內使用自訂條件約束。 清單 2 中的 Global.asax 檔案會使用 Localhost 條件約束來防止任何人要求系統管理員頁面,除非他們向本機伺服器提出要求。 例如,從遠端伺服器提出 /Admin/DeleteAll 的要求失敗。

清單 2 - Global.asax

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using MvcApplication1.Constraints;
namespace MvcApplication1
{
    public class MvcApplication : System.Web.HttpApplication
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            routes.MapRoute(
                "Admin",
                "Admin/{action}",
                new {controller="Admin"},
                new {isLocal=new LocalhostConstraint()}
            );
            //routes.MapRoute(
            //    "Default",                                              // Route name
            //    "{controller}/{action}/{id}",                           // URL with parameters
            //    new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
            //);
        }
        protected void Application_Start()
        {
            RegisterRoutes(RouteTable.Routes);
        }
    }
}

Localhost 條件約束在 Admin 路由的定義中使用。 此路由與遠端瀏覽器要求不符。 但請注意,Global.asax 中定義的其他路由可能會符合相同的要求。 請務必了解條件約束可防止特定路由比對要求,而不是 Global.asax 檔案中定義的所有路由。

請注意,Default 路由已從清單 2 中的 Global.asax 檔案加上註解。 如果您包含 Default 路由,則 Default 路由會符合 Admin 控制器的要求。 在此情況下,遠端使用者仍然可以叫用 Admin 控制器的動作,即使其要求不符合 Admin 路由也一樣。