Application_Error больше не срабатывает при публикации в IIS - PullRequest
1 голос
/ 22 октября 2010

ОК. В моем файле Global.asax есть следующий код:

void Application_Error(object sender, EventArgs e)
{
    // Code that runs when an unhandled error occurs
        Exception objError = Server.GetLastError().GetBaseException();

        Response.Redirect(
            String.Format(
            "/Error/{0}/{1}",
            ((HttpException)objError).GetHttpCode(),
            Request.RawUrl));
}

Для обеспечения аккуратных и аккуратных URL-адресов ошибок, таких как "/ Error / 404 / TheNameOfTheRequestedPage".Это отлично работает с VS 2008, но после публикации на локальном компьютере я получаю страницу ошибки по умолчанию:

Сводка ошибки

Ошибка HTTP 404.0 - НетНайдено

Ресурс, который вы ищете, был удален, изменилось его имя или временно недоступен

Кто-нибудь знает, как это сделать?Я решил не использовать system.web / customErrors, потому что у меня нет доступа к Server.GetLastError () оттуда (или, по крайней мере, он никогда не работал для меня), и я хочу получить код http.

Ответы [ 2 ]

2 голосов
/ 22 октября 2010

Скорее всего, это связано с тем, что вы вызвали ошибку IIS Http, которая определена в файле web.config под узлами

<system.webServer>    
    <httpErrors>
    </httpErrors>    
<system.webServer>

Если проблема в том, что вы возвращаете код ответа для 404 и получаете страницу IIS 404, проблема в том, что вам нужно сделать

Response.TrySkipIisCustomErrors = true;

Прежде чем вы дадите завершить ответ, в противном случае IIS перехватит ошибку.

Это совершенно непонятно, особенно если вы сами устанавливаете код состояния. Я попытался найти способ сообщить об ошибке в Microsoft Connect, которая вручную устанавливает код ошибки http, автоматически не устанавливает TrySkipIisCustomErrors, но, похоже, не может найти какой-либо соответствующий продукт для его отправки.

0 голосов
/ 27 октября 2010

У меня была похожая проблема, и звонок на Server.ClearError() перед перенаправлением все-таки решил проблему.

В вашем случае я бы написал

void Application_Error(object sender, EventArgs e) 
{ 
    // Code that runs when an unhandled error occurs 
        Exception objError = Server.GetLastError(); 
        if(objError is HttpException){
          //Need to clear the error, otherwise the buil-in redirect would occure
          Server.ClearError(); 
          Response.Redirect( 
              String.Format( 
              "/Error/{0}/{1}", 
              ((HttpException)objError).GetHttpCode(), 
              Request.RawUrl)); 
        }
} 

Обратите внимание, что Server.GetLastError (). GetBaseException () возвращает исключение base , которое не всегда является исключением HttpException, а искомым является просто GetLastError ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...