Назад | Перейти на главную страницу

Пользовательская ошибка IIS 404

Я развернул приложение ASP.NET 3.5 на 64-битном сервере Windows 2003 R2.

В web.config у меня есть следующее

<customErrors mode="RemoteOnly"
              defaultRedirect="/404/">
  <error statusCode="404"
         redirect="/404/"/>

  <error statusCode="500"
         redirect="/500/"/>
</customErrors>

В свойствах веб-сайта в диспетчере IIS я установил для ошибок 404 и 500 значение Type = "URL" и те же URL-адреса, что и в web.config.

У меня есть карта приложения с подстановочными знаками для .NET 2.0 aspnet_isapi.dll с отключенным параметром «Проверять наличие файла».

Если я пытаюсь попасть в поддельный файл .aspx, я успешно попадаю на страницу 404. Я полагаю, это потому, что существует явное сопоставление .aspx с .NET DLL.

Если я пытаюсь получить доступ к поддельному каталогу, я просто получаю простой текстовый ответ:

Система не может найти указанный файл.

Похоже, что эти запросы на каталоги не маршрутизируются через конвейер .NET, чего я ожидал (и в этом нуждался) из-за сопоставления приложений с подстановочными знаками.

Любые идеи?

Для IIS 5.0 удачный путь:

Свойства> Домашний каталог> Расширенная конфигурация: выберите интересующее вас расширение файла и установите флажок «Проверить наличие файла».

Чтобы проверить вашу логику, я фактически прошел весь процесс. Я использовал трассировку ETW для IIS и ASP.NET и Process Monitor, чтобы увидеть, что происходит. Вот что я нашел:

  1. Когда вы добавляете «Подстановочное сопоставление» для aspnet_isapi.dll со снятым флажком «Проверить, существует ли файл», весь запрос фактически проходит через конвейер .net
  2. Когда вы обращаетесь к фальшивому каталогу, .net фактически ищет все файлы .config ... т.е. machine.config, root web.config (который находится в C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ CONFIG) и ваш Web корневой каталог сайта, чтобы найти возможный HttpHandler, который сможет обработать ваш запрос
  3. Поскольку ни один из обработчиков не настроен для обработки запроса "каталога", запрос возвращается к IISGeneral: GENERAL_STATIC_FILE_HANDLER и терпит неудачу с 0x80070002 то есть FILENOTFOUND
  4. Поскольку у вас есть пользовательская ошибка IIS 404, настроенная как / 404 /, она просматривает каталог c: \ inetpub \ wwwroot \ 404 \, не работает с другим 0x80070002 и отправляет общий The system cannot find the file specified. ошибка.
  5. Когда вы обращаетесь к поддельной странице main.aspx, запрос .aspx обрабатывается в корневом файле web.config, и, следовательно, вы видите ошибку .net (ресурс не может быть найден).

  6. Теперь, когда вы устанавливаете флажок «Проверить, существует ли файл» для «Сопоставления с подстановочными знаками», сервер проверяет, существует ли запрошенный сценарий перед сопоставлением расширения с приложением.
  7. Следовательно, запрос никогда не проходит через конвейер .net и выдает ошибку, как указано в пункте 4.


Надеюсь это поможет.

Если у вас есть сопоставление с подстановочными знаками без включенного параметра «Проверить, существует ли файл», он отправит запрос в вашу DLL. Если DLL ASP.Net 2.0, к которой вы ее сопоставили, НЕ использует web.config для вашего приложения (вы упомянули, что это было для .Net 3.5), тогда она вернет общую ошибку. Если вы включите опцию «Проверить, существует ли файл», IIS увидит, что папки нет, и вместо этого будет использовать свои внутренние настройки ошибок (которые, как вы сказали, такие же, как и в web.config). Возможно, попробуйте включить эту опцию, чтобы узнать, поможет ли в вашей ситуации.