Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Стивен Уолтер (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. Если включить маршрут по умолчанию, маршрут по умолчанию будет соответствовать запросам для контроллера Администратор. В этом случае удаленные пользователи по-прежнему могут вызывать действия контроллера Администратор, даже если их запросы не будут соответствовать Администратор маршруту.