Tworzenie niestandardowego ograniczenia trasy (VB)

Autor: Stephen Walther

Stephen Walther pokazuje, jak można utworzyć ograniczenie trasy niestandardowej. Implementujemy proste ograniczenie niestandardowe, które uniemożliwia dopasowanie trasy po wysłaniu żądania przeglądarki z komputera zdalnego.

Celem tego samouczka jest zademonstrowanie sposobu tworzenia niestandardowego ograniczenia trasy. Ograniczenie trasy niestandardowej umożliwia zapobieganie dopasowywaniu trasy, chyba że zostanie dopasowany jakiś warunek niestandardowy.

W tym samouczku utworzymy ograniczenie trasy localhost. Ograniczenie trasy localhost odpowiada tylko żądaniom wysyłanym z komputera lokalnego. Żądania zdalne z Internetu nie są dopasowywane.

Ograniczenie trasy niestandardowej jest implementowane przez zaimplementowanie interfejsu IRouteConstraint. Jest to niezwykle prosty interfejs, który opisuje jedną metodę:

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

Metoda zwraca wartość logiczną. Jeśli zwrócisz wartość False, trasa skojarzona z ograniczeniem nie będzie zgodna z żądaniem przeglądarki.

Ograniczenie Localhost znajduje się na liście 1.

Lista 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

Ograniczenie w liście 1 korzysta z właściwości IsLocal uwidocznionej przez klasę HttpRequest. Ta właściwość zwraca wartość true, gdy adres IP żądania to 127.0.0.1 lub gdy adres IP żądania jest taki sam jak adres IP serwera.

Niestandardowe ograniczenie jest używane w ramach trasy zdefiniowanej w pliku Global.asax. Plik Global.asax na liście 2 używa ograniczenia Localhost, aby uniemożliwić każdemu zażądanie strony Administracja, chyba że wysyłają żądanie z serwera lokalnego. Na przykład żądanie /Administracja/DeleteAll zakończy się niepowodzeniem po wysłaniu z serwera zdalnego.

Lista 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

Ograniczenie Localhost jest używane w definicji trasy Administracja. Ta trasa nie zostanie dopasowana przez zdalne żądanie przeglądarki. Należy jednak pamiętać, że inne trasy zdefiniowane w pliku Global.asax mogą być zgodne z tym samym żądaniem. Należy pamiętać, że ograniczenie uniemożliwia dopasowanie określonej trasy do żądania, a nie wszystkie trasy zdefiniowane w pliku Global.asax.

Zwróć uwagę, że trasa domyślna została oznaczona jako komentarz z pliku Global.asax na liście 2. Jeśli dołączysz trasę domyślną, trasa domyślna będzie zgodna z żądaniami kontrolera Administracja. W takim przypadku użytkownicy zdalni nadal mogą wywoływać akcje kontrolera Administracja, mimo że ich żądania nie pasują do trasy Administracja.