Freigeben über


Erstellen einer benutzerdefinierten Routeneinschränkung (VB)

von Stephen Walther

Stephen Walther zeigt, wie Sie eine benutzerdefinierte Routeneinschränkung erstellen können. Wir implementieren eine einfache benutzerdefinierte Einschränkung, die verhindert, dass eine Route abgeglichen wird, wenn eine Browseranforderung von einem Remotecomputer erfolgt.

Das Ziel dieses Tutorials besteht darin, zu veranschaulichen, wie Sie eine benutzerdefinierte Routeneinschränkung erstellen können. Mit einer benutzerdefinierten Routeneinschränkung können Sie verhindern, dass eine Route abgeglichen wird, es sei denn, eine benutzerdefinierte Bedingung ist erfüllt.

In diesem Tutorial erstellen wir eine Localhost-Routeneinschränkung. Die Localhost-Routeneinschränkung entspricht nur Anforderungen vom lokalen Computer. Remoteanforderungen aus dem Internet werden nicht abgeglichen.

Sie implementieren eine benutzerdefinierte Routeneinschränkung, indem Sie die IRouteConstraint-Schnittstelle implementieren. Dies ist eine extrem einfache Schnittstelle, die eine einzelne Methode beschreibt:

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

Die -Methode gibt einen booleschen Wert zurück. Wenn Sie False zurückgeben, stimmt die der Einschränkung zugeordnete Route nicht mit der Browseranforderung überein.

Die Localhost-Einschränkung ist in Listing 1 enthalten.

Eintrag 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

Die Einschränkung in Listing 1 nutzt die IsLocal-Eigenschaft, die von der HttpRequest-Klasse verfügbar gemacht wird. Diese Eigenschaft gibt true zurück, wenn die IP-Adresse der Anforderung entweder 127.0.0.1 lautet oder wenn die IP-Adresse der Anforderung mit der IP-Adresse des Servers identisch ist.

Sie verwenden eine benutzerdefinierte Einschränkung innerhalb einer Route, die in der Datei Global.asax definiert ist. Die Datei Global.asax in Listing 2 verwendet die Localhost-Einschränkung, um zu verhindern, dass jemand eine Admin Seite anfordert, es sei denn, er stellt die Anforderung vom lokalen Server. Beispielsweise schlägt eine Anforderung für /Admin/DeleteAll fehl, wenn sie von einem Remoteserver ausgeführt wird.

Listing 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

Die Localhost-Einschränkung wird in der Definition der Admin Route verwendet. Diese Route wird nicht durch eine Remotebrowseranforderung abgeglichen. Beachten Sie jedoch, dass andere routen, die in Global.asax definiert sind, möglicherweise mit derselben Anforderung übereinstimmen. Es ist wichtig zu verstehen, dass eine Einschränkung verhindert, dass eine bestimmte Route mit einer Anforderung übereinstimmt und nicht alle Routen, die in der Datei Global.asax definiert sind.

Beachten Sie, dass die Standardroute aus der Datei Global.asax in Listing 2 auskommentiert wurde. Wenn Sie die Standardroute einschließen, entspricht die Standardroute anforderungen für den Admin-Controller. In diesem Fall könnten Remotebenutzer weiterhin Aktionen des Admin-Controllers aufrufen, obwohl ihre Anforderungen nicht mit der Admin Route übereinstimmen würden.