Обход системы маршрутизации
Настройка свойства RouteExistingFiles
, которое мы показали в предыдущем разделе, делает систему маршрутизации более содержательной. Запросы, которые обычно обходят систему маршрутизации, в настоящее время оцениваются по отношению к роутам, которые мы определили.
Противоположностью этой функции является возможность сделать систему маршрутизации менее содержательной, то есть ссылки не будут оцениваться по отношению к нашим роутам. Мы делаем это с помощью метода IgnoreRoute
класса RouteCollection
, как показано в листинге 13-35.
Листинг 13-35: Использование метода IgnoreRoute
public static void RegisterRoutes(RouteCollection routes) {
routes.RouteExistingFiles = true;
routes.IgnoreRoute("Content/{filename}.html");
routes.MapRoute("DiskFile", "Content/StaticContent.html",
new {
controller = "Customer",
action = "List",
});
routes.MapRoute("ChromeRoute", "{*catchall}",
new { controller = "Home", action = "Index" },
new {
customConstraint = new UserAgentConstraint("Chrome")
},
new[] { "UrlsAndRoutes.AdditionalControllers" });
routes.MapRoute("MyRoute", "{controller}/{action}/{id}/{*catchall}",
new { controller = "Home", action = "Index",
id = UrlParameter.Optional },
new[] { "URLsAndRoutes.Controllers" });
}
Мы можем использовать сегментные переменные, такие как {filename}
, для соответствия с рядом URL. В этом случае URL паттерн будет соответствовать любому двухсегментному URL, где первым сегментом является Content
, а второй сегмент имеет расширение .html
.
Метод IgnoreRoute
создает запись в RouteCollection
, где обработчиком роута является экземпляр класса StopRoutingHandler
, а не MvcRouteHandler
. Система маршрутизации очень хорошо распознает этот обработчик. Если URL паттерн, переданный методу IgnoreRoute
, находит соответствие, то никакие последующие роуты не будут оцениваться, как и в случае с обычным роутом. Отсюда следует, что важно то место, где вызывается метод IgnoreRoute
. Если вы запустите приложение и снова перейдете по URL /Content/StaticContent.html
, вы увидите содержимое HTML файла, так как объект StopRoutingHandler
обрабатывается перед любым другим роутом.