2010-10-09 2 views
0

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

Все работает нормально, если только исключение не растет в событии 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: // локальный/APP/Страницы/Бытовки/Страницы /ErrorView.aspx

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

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

ответ

3

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

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

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

+0

Я хотел добавить немного к этому - что может вызвать путаницу на первый взгляд. Когда вы используете Server.Transfer, он не запускает новый ответ. Если вы написали что-либо в ответ (например, если ошибка происходит на полпути через создание вывода для страницы), вы получите свою новую страницу в этом контексте. Если вы хотите удостовериться, что ваша страница ошибки является единственной вещью, отображаемой в браузере, вам нужно вызвать Response.Clear * before *, чтобы вызвать Server.Transfer. (Один из других ответов ниже упоминает это кратко.) – TLS

+0

Я нашел это объяснение (использование статических страниц) очень полезно .. :) – sajad

Смежные вопросы