В чем разница между этими двумя 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 по этому предмету довольно скупа.
599   2  

2 ответов:

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

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

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

{*path}.aspx/{*pathinfo}

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

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

Разница между двумя вызовами 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, etc, etc.

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

Comments

    Ничего не найдено.