В чем разница между этими двумя директивами IgnoreRoute ASP.NET MVC? - PullRequest
7 голосов
/ 22 августа 2011

Шаблон проекта ASP.NET MVC 3 по умолчанию содержит следующую директиву IgnoreRoute:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

Я видел, как несколько проектов изменили эту строку (включая DataExplorer StackExchange ) навместо этого что-то похожее на:

routes.IgnoreRoute("{*allaxd}", new {allaxd = @".*\.axd(/.*)?"});

Может ли кто-нибудь объяснить в каком сценарии или вообще, почему игнорирование маршрута по умолчанию .axd не будет адекватным, в то время как последняя версия будет? Или наоборот, , почему можно было бы не использовать эту последнюю версию и вместо этого просто придерживаться версии по умолчанию?

Я должен признать, что не до конца понимаю IgnoreRouteсинтаксис и документация MSDN по теме довольно краткая.

Ответы [ 2 ]

6 голосов
/ 22 августа 2011

В блоге Фила Хаака есть объяснение: Маршрутизация игнорирует запросы на расширение файла

Основная идея, цитируемая Филом:

OneРешение этой проблемы - добавить соответствующий маршрут игнорирования, чтобы указать, что маршрутизация должна игнорировать эти запросы.К сожалению, мы не можем сделать что-то вроде этого:

{*path}.aspx/{*pathinfo}

Мы разрешаем только один универсальный маршрут, и это должно произойти в конце URL.Тем не менее, вы можете использовать следующий подход ...

То, что я делаю здесь, - это метод, который показал мне Эйлон, который состоит в том, чтобы сопоставить все URL-адреса с этими маршрутами, но затем ограничить, какие маршруты игнорировать через ограничениятолковый словарь.Таким образом, в этом случае эти маршруты будут совпадать (и, следовательно, игнорировать) все запросы на favicon.ico (независимо от того, какой каталог), а также запросы на файл .aspx.Поскольку мы указали, что маршрутизация игнорирует эти запросы, произойдет обычная обработка этих запросов ASP.NET.

3 голосов
/ 07 марта 2013

Разница между двумя IgnoreRoute звонками из исходного сообщения заключается в следующем:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

Это будет соответствовать запросам к ресурсам, таким как / ScriptManager.axd или / Foo.axd / bar / baz.aspx , но не будет соответствовать запросу на любой ресурс *. axd ниже корня вашего сайта, например / foo / bar / Baz.axd .

routes.IgnoreRoute("{*allaxd}", new {allaxd = @".*\.axd(/.*)?"});

Этот вызов использует регулярное выражение для сопоставления запроса с любым ресурсом *. Axd на любом уровне вашего сайта, например, / foo / bar / Baz.axd . Поэтому этот вызов предпочтительнее первого, если вы ссылаетесь на любые ресурсы axd, расположенные ниже корня вашего сайта.

Если вы разобьете регулярное выражение, .* в начале будет соответствовать 0 или более символам. \.axd будет соответствовать буквенной строке ".axd", а (/.*)? будет дополнительно совпадать с косой чертой, за которой следует 0 или более символов.

* в шаблоне URL {*allaxd} гарантирует, что будет просканирован весь путь, а не только один участок пути. allaxd - это просто метка произвольного обозначения, присваиваемая совпадающей части пути, которая в этом случае будет всей траекторией. Этот метод эффективного игнорирования маршрутов позволяет игнорировать маршруты для определенных расширений файлов. Вы можете легко скопировать этот вызов и внести несколько изменений, чтобы игнорировать маршруты для * .aspx, * .asmx и т. Д. И т. Д.

Для получения подробной документации по маршрутизации я настоятельно рекомендую следующую страницу MSDN .

...