2013-12-14 5 views
1

Я пытаюсь сделать ошибку более изящно, когда пользователь пытается загрузить файл, который слишком велик для сервера. Однако, когда я пытаюсь зафиксировать ошибку в Global.asax.cs, она, похоже, пропустит мой код перенаправления. Вот ядро ​​того, что у меня есть.Невозможно перенаправить из Application_Error даже после устранения ошибки

protected void Application_Error(object sender, EventArgs e) 
{ 
    HttpContext.Current.ClearError(); 
    Response.Redirect("CustomErrors.aspx", false); 
    Context.ApplicationInstance.CompleteRequest(); 
} 

Повсюду я смотрю «ответ», похоже, чтобы очистить ошибку, но я уже это сделал. Что еще может пойти не так. Есть идеи?

ответ

0

Я только попробовал ваш код, и когда я поднимаю необработанную ошибку в Page_Load() моей тестовой страницы, а затем попытаться перенаправить с HttpContext.Current.ClearError() присутствующее в методе Application_Error() я получаю

Не может Перенаправление после заголовка HTTP была отправлена ​​ошибка

Удаление этого метода ClearError(), решает эту проблему.

Если, однако, я поднимаю событие внутри события на странице (т. Е. Нажимает кнопку), это отлично работает даже при вызове HttpContent.Current.ClearError().

Одна вещь, которую я заметил, у вас нет «~ /» перед «CustomError.aspx», вы можете добавить это, чтобы страница была найдена независимо от того, где была поднята ошибка. (Я думаю, что у вас было несколько папок и произошла ошибка, контекст будет в текущей папке).

Лучшим способом добавления страницы пользовательской ошибки является просто изменение web.config с необходимой конфигурацией, это приведет к перенаправлению для вас. Вы все равно можете зарегистрировать ошибку (через Log4Net или ее эквивалент) в методе Application_Error(). Вы можете найти это question, полезно, если вы хотите отобразить исключение на своей странице ошибок.

Из этого link

<configuration> 
    ... 

    <system.web> 
     <customErrors mode="RemoteOnly" 
         defaultRedirect="~/ErrorPages/Oops.aspx" /> 

     ... 
    </system.web> 
</configuration> 
+0

«заголовок страницы уже был отправлен клиенту по времени метод Page_Load() был вызван.» Эээ? Нет, нет. Они * были * подняты к тому времени, когда событие «Application_Error» было запущено. –

+0

Спасибо за исправление @AntP, я соответственно изменю свой ответ. – Damon

+0

Стоит также отметить, что 'Page_Load' фактически происходит * перед * другими обработчиками событий, такими как кнопки для щелчков кнопок (ваш ответ, похоже, предполагает, что это наоборот), поэтому вполне разумно перенаправить метод' Page_Load'. –

0

Альтернативой является обеспечение следующих установлено.

Response.BufferOutput = true;

Таким образом, ответ не отправляется (включая заголовки), пока ответ не будет готов к отправке.

См. Здесь.

Server cannot set status after HTTP headers have been sent IIS7.5

+0

Я пробовал это. Он по-прежнему не перенаправляется. Пожалуйста, ознакомьтесь с приведенной ниже ссылкой для описания проблемы, с которой я столкнулся, и ответа, который не работает: http://www.developer.com/db/article.php/10920_3426051_2 – Dalal

1

Я знаю, что это старая нить, но я нашел способ обойти это ...

В случае ниже Google бот проезжал недопустимые символы URL, и я хотел бы просто перенаправить по умолчанию.

После устранения ошибки Server.ClearError(); то вы можете перенаправить на любую страницу своего сайта.

void Application_Error(object sender, EventArgs e) 
{ 
    //... other code here.... 

    var Message = ex.Message.ToLower(); 
    var RootURL = Common.GetAppPathMasterPages() + "default.aspx"; 

    if (Message.Contains("does not exist") || Message.Contains("potentially dangerous request")) 
    { 
     Server.ClearError(); 
     HttpContext.Current.Response.Redirect(RootURL); 
     return; 
    }  

}