Физическая папка нарушает маршрутизацию URL-адресов ASP.NET в IIS Express

IIS Express выдает 403.14 Forbidden ошибки, когда URL-адрес, который в противном случае обрабатывался бы посредством маршрутизации URL-адресов ASP.NET, соответствует физической папке в моем проекте ASP.NET. (Папка содержит только код, и это совпадение, что имя папки совпадает с URL-адресом страницы; моя структура URL-адреса определяется динамически базой данных, и пользователи могут редактировать эту структуру, поэтому, хотя я мог просто переименовать свою папку проекта, в общем, я не могу предотвратить такое столкновение.)

Похоже, это происходит из-за того, что DirectoryListingModule вмешивается, чтобы обработать запрос, а затем сразу же не выполняет его, потому что просмотр каталогов отключен. Я пробовал удалить это:

<system.webServer>
  <handlers>
    <remove name="StaticFile" />
    <add name="StaticFile" path="*" verb="*"
         modules="StaticFileModule" resourceType="Either" requireAccess="Read" />
  </handlers>
</system.webServer>

Это удаляет конфигурацию обработчика StaticFile по умолчанию, которая имеет modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule", и заменяет ее конфигурацией, которая предоставляет только ту функцию, которую я хочу. (Я хочу обслуживание статических файлов, но мне не нужен список каталогов или документы по умолчанию в этом приложении.) Но эффект, похоже, таков, что IIS затем выдает полностью пустой (0 байт) ответ (со статусом 200), когда я нажимаю оскорбительная страница.

Итак, затем я попытался настроить обработчик StaticFile для обработки только определенных физических папок, которые я хочу сделать доступными:

<system.webServer>
  <handlers>
    <remove name="StaticFile" />
    <add name="StaticFileCss" path="style/*.css" verb="*"
         modules="StaticFileModule" resourceType="Either" requireAccess="Read" />
    <add name="StaticFileScripts" path="Scripts/*" verb="*"
         modules="StaticFileModule" resourceType="Either" requireAccess="Read" />
  </handlers>
</system.webServer>

Но когда я нажимаю неправильный URL-адрес, возникает 404.4 - Not found ошибка с сообщением The resource you are looking for does not have a handler associated with it.. (Подробная информация об ошибке на странице ошибки говорит, что мы находимся в модуле IIS Web Core, во время уведомления MapRequestHandler обработчиком является Not yet determined, и есть код ошибки 0x80070002, который представляет собой COM HRESULT, соответствующий ошибке Win32 ERROR_FILE_NOT_FOUND. )

Загадочно то, что ASP.NET даже не удосуживается спросить, есть ли у него обработчик для этого. Кажется, что IIS сам по себе решает, что обработчика точно нет.

Это происходит только тогда, когда есть папка, соответствующая URL-адресу. Все другие ресурсы с динамически определяемыми URL-адресами работают нормально - IIS запрашивает у ASP.NET обработчик, механизм маршрутизации ASP.NET работает как обычно, и если URL-адрес соответствует одной из моих динамически определяемых страниц, все работает нормально. Просто наличие физической папки мешает всему этому работать.

Я вижу, что это делает IIS, потому что я получаю одну из страниц ошибок в стиле IIS для этого 404, и они имеют отличительный дизайн, который сильно отличается от 404, созданных ASP.NET. (Если я попытаюсь перейти к URL-адресу, который не соответствует ни физической папке, ни динамическому ресурсу, я получаю страницу 404, созданную ASP.NET. Обычно IIS определенно передает запросы в ASP.NET, но IIS определенно мешает этим проблемным ресурсам.)

Я попытался добавить это в свой <system.WebServer>, на случай, если проблема заключалась в том, что IIS решил, что запросы, соответствующие физическим папкам, не соответствуют предварительному условию managedHandler:

<modules runAllManagedModulesForAllRequests="true">

Но это, похоже, не помогает - он по-прежнему не включает маршрутизацию ASP.NET для URL-адресов, которые соответствуют физическим папкам. В любом случае это было бы неоптимально - я бы предпочел, чтобы управляемые обработчики не запускались для контента, который я определенно хочу обрабатывать как статический контент. Я действительно хочу, чтобы маршрутизация URL-адресов ASP.NET использовалась в качестве средства защиты - я хочу, чтобы она применялась только в том случае, если URL-адрес определенно не относится к статическому содержимому.

Я не понимаю, почему ASP.NET даже не спрашивает ASP.NET, что он думает в этом сценарии. Почему он не вызывает ASP.NET на этапе MapRequestHandler, если есть физическая папка, которая соответствует URL-адресу?


person Ian Griffiths    schedule 12.07.2013    source источник


Ответы (1)


При обнаружении физического файла или папки с тем же URL-адресом, что и у маршрута, маршруты не будут обрабатывать запрос, и физический файл будет обслужен.

Вы можете изменить это поведение, установив для свойства RouteExistingFiles объекта RouteCollection значение true.

Взгляните на страницу MSDN Сценарии, когда маршрутизация не применяется

person Victor    schedule 01.08.2013