建立自訂的路由條件約束 (VB)
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 路由也一樣。