В чем разница между этими двумя директивами ASP.NET MVC IgnoreRoute?
Шаблон проекта ASP.NET MVC 3 по умолчанию содержит следующее IgnoreRoute
директива:
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
Теперь я видел, как несколько проектов изменили эту строку (включая DataExplorer от StackExchange) на что-то похожее на:
routes.IgnoreRoute("{*allaxd}", new {allaxd = @".*\.axd(/.*)?"});
Кто-нибудь может объяснить, по какому сценарию или вообще почему по умолчанию .axd
игнорирование маршрута не будет адекватным, в то время как эта последняя версия будет? Или наоборот, почему можно не использовать эту последнюю версию и вместо этого просто придерживаться стандартной версии?
Я должен признать, что я не совсем понимаю IgnoreRoute
синтаксис и документация MSDN по этому вопросу довольно лаконичны.
2 ответа
В блоге Фила Хаака есть объяснение: " Маршрутизация игнорирует запросы на расширение файла"
Основная идея, цитируемая Филом, такова:
Одним из решений этой проблемы является добавление соответствующего маршрута игнорирования, чтобы указать, что маршрутизация должна игнорировать эти запросы. К сожалению, мы не можем сделать что-то вроде этого:
{*path}.aspx/{*pathinfo}
Мы разрешаем только один универсальный маршрут, и он должен произойти в конце URL. Тем не менее, вы можете принять следующий подход....
То, что я делаю здесь, - это метод, который показал мне Эйлон, который состоит в том, чтобы сопоставить все URL-адреса с этими маршрутами, но затем ограничить, какие маршруты игнорировать через словарь ограничений. Таким образом, в этом случае эти маршруты будут совпадать (и, следовательно, игнорировать) все запросы на favicon.ico (независимо от того, какой каталог), а также запросы на файл.aspx. Поскольку мы указали маршрутизации игнорировать эти запросы, произойдет обычная обработка этих запросов в ASP.NET.
Разница между двумя IgnoreRoute
Звонки из оригинального поста следующие:
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
Это будет соответствовать запросам к ресурсам, таким как /ScriptManager.axd или /Foo.axd/bar/baz.aspx, но не будет соответствовать запросу к любому ресурсу *.axd ниже корня вашего сайта, например /foo/bar/Baz. топор
routes.IgnoreRoute("{*allaxd}", new {allaxd = @".*\.axd(/.*)?"});
Этот вызов использует регулярное выражение для сопоставления запроса с любым ресурсом *.axd на любом уровне вашего сайта, например, /foo/bar/Baz.axd. Поэтому этот вызов предпочтительнее первого, если вы ссылаетесь на любые ресурсы axd ниже корня вашего сайта.
Если вы сломаете регулярное выражение, .*
в начале будет соответствовать 0 или более любого символа. \.axd
будет соответствовать буквенной строке ".axd"
, а также (/.*)?
будет необязательно совпадать с косой чертой, за которой следует 0 или более символов.
*
в {*allaxd}
Шаблон URL гарантирует, что будет просканирован весь путь, а не только один раздел пути. allaxd
это просто метка произвольного обозначения, присваиваемая совпадающей части пути, которая в этом случае будет всей траекторией. Этот метод эффективного игнорирования маршрутов позволяет игнорировать маршруты для определенных расширений файлов. Вы можете легко скопировать этот вызов и внести несколько изменений, чтобы игнорировать маршруты для *.aspx, *.asmx и т. Д. И т. Д.
Для получения подробной документации по маршрутизации я настоятельно рекомендую следующую страницу MSDN.