В чем разница между этими двумя директивами 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.

Другие вопросы по тегам