Могу ли я обработать все ошибки через ASP.Net ?

#asp.net #iis #application-error

#asp.net #iis #ошибка приложения

Вопрос:

Я пытаюсь создать страницу обработки 404, но теперь я застрял на странице, работающей только для файлов .aspx, что на самом деле не то, что мне нужно.

Я работаю на IIS6. Сайт имеет сопоставление с шаблоном для URL-адресов без расширения. Все запросы проходят через Application_BeginRequest в Global.asax, но не все ошибки проходят через Application_Error.

Есть ли способ, с помощью которого я могу вызвать Application_Error для файлов, отличных от .aspx?

Это код внутри Application_Error

 HttpException serverError = (HttpException)Server.GetLastError();

if (serverError != null) {
    int errorCode = serverError.GetHttpCode();
    if (errorCode == 404) {
        Server.ClearError();
        Server.Transfer("/errorPage.aspx");
    }
}
  

Ответ №1:

Единственный способ, которым я успешно справился с этим с помощью IIS 6, — это добавить специальный обработчик для 404 в пользовательских ошибках IIS, который указывает на один из ваших файлов .aspx или .ashx (т. Е. указать его на вашу страницу ошибок.aspx).

Комментарии:

1. Когда я попытался, это перенаправило на ErrorPage.aspx. Мне нужно для этого сохранить тот же URL-адрес в браузере, а также вернуть код состояния 404.

2. Теперь я понимаю. Вы упомянули об использовании перезаписи URL выше. Если это так, то что тогда представляет собой 404 в вашей настройке? Похоже, вам понадобится другое правило перезаписи, которое запускается при сбое всех остальных. Последнее правило было бы перезаписано в ErrorPage.aspx, и эта страница должна была бы гарантировать, что код состояния 404 был отправлен через ответ.

3. Возможно, я говорю здесь что-то глупое, но не помешает ли это запросам, выполняемым к страницам, которые я не хочу переписывать? Вы говорите, что я должен создать правило, которое в принципе соответствует любой строке. Это правильно?

4. Это вовсе не глупое утверждение. Я представлял, что вы все переписываете в своем приложении. Если это не так, вы не хотите добавлять всеобъемлющее правило, потому что, как вы заявили, это предотвратило бы выполнение ваших физических страниц.

5. Обычно machine.config сервера или master web.config сервера настроены для обработки физических страниц через PageHandlerFactory: <добавить путь=» .aspx» verb=» » type=»System.Web.UI.PageHandlerFactory» validate=»True»/>. Вы всегда можете создать свою собственную фабрику, которая наследуется от PageHandlerFactory, удалить указанную выше в вашей конфигурации с помощью <remove name=»*.aspx» />, затем добавить свою. Метод getHandler вашей фабрики вызовет base. getHandler и проверьте результат на null. Если значение равно null (404), вы должны создать экземпляр вашей страницы ошибок и вернуть его. Не идеально, но это должно сработать.