Невозможно перенаправить из Application_Error даже после устранения ошибки

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

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

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

3 ответа

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

В приведенном ниже примере бот 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;
 }

}


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

Не удается перенаправить после отправки HTTP-заголовка

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

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

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

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

Из этой ссылки

<configuration>
 ...

 <system.web>
 <customerrors mode="RemoteOnly" defaultredirect="~/ErrorPages/Oops.aspx">

 ...
 </customerrors></system.web>
</configuration>


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

Response.BufferOutput = true;

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

Глянь сюда.

Сервер не может установить статус после отправки заголовков HTTP IIS7.5

licensed under cc by-sa 3.0 with attribution.