共用方式為


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

作者:Stephen Walther

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

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

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

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

Function Match ( _
    httpContext As HttpContextBase, _
    route As Route, _
    parameterName As String, _
    values As RouteValueDictionary, _
    routeDirection As RouteDirection _
) As Boolean

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

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

清單 1 - LocalhostConstraint.vb

Public Class LocalhostConstraint
    Implements IRouteConstraint
    Public Function Match( _
                ByVal httpContext As HttpContextBase, _
                ByVal route As Route, _
                ByVal parameterName As String, _
                ByVal values As RouteValueDictionary, _
                ByVal routeDirection As RouteDirection _
            ) As Boolean Implements IRouteConstraint.Match
        Return httpContext.Request.IsLocal
    End Function
End Class

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

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

清單 2 - Global.asax

Public Class MvcApplication
    Inherits System.Web.HttpApplication
    Shared Sub RegisterRoutes(ByVal routes As RouteCollection)
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}")
        routes.MapRoute( _
            "Admin", _
            "Admin/{action}", _
            New With {.controller = "Admin"}, _
            New With {.isLocal = New LocalhostConstraint()} _
        )
        'routes.MapRoute( _
        '    "Default", _
        '    "{controller}/{action}/{id}", _
        '    New With {.controller = "Home", .action = "Index", .id = ""} _
        ')
    End Sub
    Sub Application_Start()
        RegisterRoutes(RouteTable.Routes)
    End Sub
End Class

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

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