В чем разница между этими двумя 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}Мы разрешаем только один маршрут 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