Поделиться через


Создание пользовательского ограничения маршрута (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, использует свойство IsLocal, предоставляемое классом HttpRequest. Это свойство возвращает значение true, если IP-адрес запроса равен 127.0.0.1 или если IP-адрес запроса совпадает с IP-адресом сервера.

Пользовательское ограничение используется в маршруте, определенном в файле Global.asax. В файле Global.asax в листинге 2 используется ограничение Localhost, чтобы запретить кому-либо запрашивать страницу Администратор, если он не сделает запрос с локального сервера. Например, запрос /Администратор/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 используется в определении маршрута Администратор. Этот маршрут не будет соответствовать запросу удаленного браузера. Однако следует понимать, что другие маршруты, определенные в Global.asax, могут соответствовать тому же запросу. Важно понимать, что ограничение не позволяет определенному маршруту сопоставить запрос, а не все маршруты, определенные в файле Global.asax.

Обратите внимание, что маршрут по умолчанию был закомментирован из файла Global.asax в листинге 2. Если включить маршрут по умолчанию, маршрут по умолчанию будет соответствовать запросам для контроллера Администратор. В этом случае удаленные пользователи по-прежнему могут вызывать действия контроллера Администратор, даже если их запросы не будут соответствовать Администратор маршруту.