Что такое routes.IgnoreRoute («{resource} .axd / {* pathInfo}»)

95

Что routes.IgnoreRoute("{resource}.axd/{*pathInfo}")

Я не могу найти ни одного файла .axd в своем проекте, могу ли я удалить это правило маршрута?

Эрик Инь
источник

Ответы:

81

Файлы .axd физически не существуют. ASP.NET внутренне использует URL-адреса с расширениями .axd (ScriptResource.axd и WebResource.axd), и они обрабатываются HttpHandler.

Следовательно, вы должны соблюдать это правило, чтобы предотвратить попытки ASP.NET MVC обработать запрос вместо того, чтобы позволить выделенному HttpHandler сделать это.

Рой Диктус
источник
5
Я почти уверен, что вы хотите, чтобы люди могли загружать на ваш сайт «файлы axd», поскольку они содержат javascript и стили.
Moulde
3
Это неверный ответ. Причина включения IgnoreRouteконфигурации маршрутизации MVC - убедиться, что MVC не пытается обработать запрос. Это связано с тем, что .axdконечные точки должны обрабатываться другим обработчиком HTTP (обработчиком, который не является частью MVC) для обслуживания сценариев.
NightOwl888,
1
Это совершенно не нужно в ядре .NET? Я искал в Google около часа и не могу найти никаких ссылок на эквивалентные шаги, поэтому я предполагаю, что это просто не нужно.
Dinerdo
35

Немного фона

Если вы откроете этот файл:

%WINDIR%\Microsoft.NET\Framework\version\Config\Web.config

вы найдете это в файле:

<add path="WebResource.axd"
     verb="GET"
     type="System.Web.Handlers.AssemblyResourceLoader"
     validate="True" />

Это в основном говорит среде выполнения Asp.NET: «Привет, чувак, asp.net, если приходит запрос на WebResource.axd, тогда используйте AssemblyResourceLoader для обработки запроса».

Обратите внимание, что WebResource.axd - это НЕ файл, а просто карта (если можно так сказать) AssemblyResourceLoader. Это имя, под которым зарегистрирован обработчик. На своей машине я обнаружил следующие обработчики .axd:

<add path="eurl.axd" verb="*" type="System.Web.HttpNotFoundHandler" validate="True" />
<add path="trace.axd" verb="*" type="System.Web.Handlers.TraceHandler" validate="True" />
<add path="WebResource.axd" verb="GET" type="System.Web.Handlers.AssemblyResourceLoader" validate="True" />
<add verb="*" path="*_AppService.axd" 

Итак, что делает этот обработчик?

Он AssemblyResourceLoaderзнает, как искать встроенные файлы в сборке, чтобы обслуживать ее (отправлять клиенту, то есть браузеру). Например, в веб-формах asp.net, если вы используете элементы управления проверкой, они зависят от некоторого javascript для отображения ошибок на веб-странице. Однако этот javascript встроен в сборку. Браузеру нужен javascript, поэтому вы увидите это в HTML-коде страницы:

<script src="/YourSite/WebResource.axd?d=fs7zUa...&amp;t=6342..." type="text/javascript"></script>

Он AssemblyResourceLoaderнайдет сборку, в которую встроен javascript, используя информацию в строке запроса, и вернет javascript.


Вернуться к вопросу

Итак, чтобы ответить на вопрос, что это:

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

Это говорит механизму маршрутизации, что мы не будем обрабатывать те запросы, которые соответствуют этому шаблону маршрута. Другими словами, мы не будем обрабатывать .axdзапросы. Зачем? Потому что сам по себе MVC является HttpHandler похож на .axdи .aspxи многие другие обработчик , которые находятся в файле web.config. Обработчик MVC не знает, как обрабатывать запрос, например искать встроенные ресурсы в сборке, - он AssemblyResourceLoaderзнает, как это сделать. MVC знает, как это сделать, ну и все, что он делает, что выходит за рамки этого вопроса и ответа.

Кодирование
источник
2
Это определенно, безусловно, должен быть принятый ответ плюс еще один от меня.
Яхья
Наконец, четкое объяснение того, что на самом деле делает WebResource.axd, а также четкий ответ на вопрос. Спасибо
ben_mj
18

Маршрут с шаблоном {resource} .axd / {* pathInfo} включен для предотвращения передачи на контроллер запросов файлов веб-ресурсов, таких как WebResource.axd или ScriptResource.axd.

Ссылка для чтения: http://msdn.microsoft.com/en-us/library/cc668201%28v=vs.100%29.aspx

Вы также можете указать, что маршрутизация не должна обрабатывать определенные URL-запросы. Вы предотвращаете обработку определенных запросов маршрутизацией, определяя маршрут и указав, что для обработки этого шаблона следует использовать класс StopRoutingHandler . Когда запрос обрабатывается объектом StopRoutingHandler, объект StopRoutingHandler блокирует любую дополнительную обработку запроса как маршрута. Вместо этого запрос обрабатывается как страница ASP.NET, веб-служба или другая конечная точка ASP.NET. Вы можете использовать метод RouteCollection.Ignore (или RouteCollectionExtensions.IgnoreRoute для приложений MVC) для создания маршрутов, использующих класс StopRoutingHandler .

Кумар Маниш
источник
7

Это не файлы (их нет на диске) - это просто имена, под которыми зарегистрированы некоторые обработчики HTTP.

Кумар Маниш
источник
наиболее актуальный ответ я бы сказал.
Сакхивел