Обработка исключений Application_Error, бесконечный цикл перенаправления и проблема загрузки CSS - PullRequest
0 голосов
/ 09 октября 2010

У меня есть обработка ошибок в событии Application_Error файла globals.asax. Внутри этого события я использую метод Response.Redirect(~errorview.aspx) для перенаправления на сайт, который может обрабатывать ошибки удобным для пользователя способом.

Все работает нормально, если исключение не возникает в событии Application_Start. Когда там происходит ошибка, мое приложение попадает в бесконечный цикл с неоднократным попаданием метода Application_Error. Более того, страница, на которую я перенаправляю, никогда не попадет под удар. Изменение метода Response.Redirect(~errorview.aspx) на Response.Redirect(~errorview.aspx, false) ничего не меняет.

Хорошей новостью является то, что когда Response.Redirect(~errorview.aspx) был заменен на Server.Transfer(~errorview.aspx), страница errorview.aspx успешно получает доступ.

Побочным эффектом теперь не является загрузка CSS, и страница errorview.aspx выглядит некрасиво. Более того, CSS не загружается только , когда возникает исключение в Application_Start событии. Исключения, выброшенные из любого другого места, не создают беспорядка в CSS.

Как я могу правильно решить эту проблему и почему CSS отсутствует в одной конкретной ситуации? Как правильно обрабатывать ошибки в моем случае?

UPDATE

Для загрузки CSS я использую это:

<link href="~/Css/Layout/style.css" type="text/css" rel="stylesheet" 
      runat="server" ID="_uid" />

страница ошибки, с которой я перевожу: http://localhost/APP/Pages/Module/Pages/ErrorView.aspx

путь к папке css: http://localhost/APP/Pages/Module/CSS/Layout/style.css

Спасибо за любые подсказки заранее. С уважением.

1 Ответ

3 голосов
/ 14 октября 2010

Если вы получаете исключения во время Application_Start, у вас есть большие проблемы, чем попытка загрузки CSS на странице ошибок. Application_Start предназначен в качестве загрузчика для веб-сайта, чтобы инициализировать все. Если вы не можете успешно инициализировать приложение, вы, вероятно, не сможете обслуживать любые запросы. (Вы не должны публиковать приложение в производственной среде, если в любом случае известно, что в Application_Start есть исключения.)

В конечном итоге Server.Transfer просто переключается с обработки текущего пути на обработку нового пути. Контекст запроса не изменяется, поэтому любые относительные ссылки в новом пути относятся к запросу original . Если в Application_Start происходит исключение, исходный запрос отсутствует. (Запросы не обрабатываются Application_Start. Запрос может вызвать запуск Application_Start, но он ничего не знает о запросе.) Вероятно, поэтому Server.Transfer из исключения Application_Start не загружает CSS - оригинала нет контекст запроса.

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

...