ASP.NET MVC HandleError не работает (customErrors установлен на "On")
Я считаю, что я настроил наше приложение MVC для правильного использования [HandleError]
. Это мой контроллер:
[HandleError]
public class SupportController : BaseController {
public ActionResult Toss() {
throw new Exception("uh oh");
}
// snip
}
И у меня есть установите тег customErrors
в web.config
на "On":
<customErrors mode="On"></customErrors>
Тем не менее, я все еще получаю "Желтый экран смерти" на исключениях. Установка точки останова в моем действии Toss()
показывает, что HttpContext.IsCustomErrorEnabled
установлено значение true.
Мы ничего не делаем с View Engine, а BaseController
ничего не путает (и другие контроллеры, которые не расширяют его, имеют одинаковую проблему).
Я развиваюсь в Windows XP и имею ту же проблему, когда приложение развернуто в поле сервера 2003 (IIS 6).
Я не думаю, что на странице error.aspx
есть исключение:
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo>" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
</asp:Content>
<asp:Content ID="errorContent" ContentPlaceHolderID="MainContent" runat="server">
<h2>
Sorry, an error occurred while processing your request.
</h2>
</asp:Content>
Одна вещь, которая может быть другой, заключается в том, что это приложение было создано обратно, когда MVC Beta была последней версией, и была обновлена до RC, а затем RTM по мере их выпуска. Может ли быть какая-то странная настройка, оставшаяся оттуда?
Я могу заставить эту работу работать с другими приложениями, поэтому я немного запутался.
Ответы
Ответ 1
Это, как правило, происходит, если есть проблема с обработкой страницы с ошибкой. Если вы отлаживаете приложение, сразу после первого исключения вы будете сталкиваться с проблемой (исключение из страницы с ошибкой). У меня было это, и причиной для меня было то, что у меня была строго типизированная главная страница, страница с ошибками использовала эту главную страницу, и поскольку главная страница использует ту же модель, что и фактическая страница, на главной странице была получена модель HandlerErrorInfo, а не набранная модель я ожидается..
Лично я считаю, что это плохой дизайн в asp.net mvc (вместе с остальной частью), но вы можете обойти это достаточно легко, не используя одну и ту же главную страницу (вы даже можете сделать наследование главной страницы, где вы имеют унаследованную строго типизированную главную страницу, которая наследует только слой от нетипизированного.
В противном случае это какое-то исключение происходит в представлении об ошибках.. (скорее всего).
Ответ 2
Если вы используете IE9, есть еще одна проблема. Кажется, IE9 скрывает страницу с ошибкой, если она меньше 1Kb, как сказано в:
asp-net-mvc-3-handleerror-global-filter-always-shows-iis-status-500-page
Убедитесь, что тело содержимого больше 1 Кб.
Попытайтесь добавить это в конце страницы с ошибкой:
@(новая строка ('', 1000)
Ответ 3
Другой причиной этой проблемы может быть,
В приложении Template MVC (сгенерированном VS2008/VS2008 Express) Error.aspx(сгенерированный VS) использует главную страницу.
Если на главной странице будет доступ к любой ViewData, она будет генерировать нулевую ссылку Exception, тогда ошибка .aspx не будет показана.
Используйте этот простой код как ваш Error.aspx, он решит проблему (вместе с CustomErrors = On)
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo>" %>
<%= Model.Exception.Message %>
Ответ 4
У меня была такая же проблема, и после исследования я обнаружил, что обновляю файл web.Debug.config
в web.config
.
Затем я создал тег CustomErrors
в файле web.config
, и он работал у меня.
Ответ 5
После долгих вытягиваний волос я обнаружил, что моя проблема относится к общей категории "исключение исключения из кода только для того, чтобы выбросить другую ошибку при визуализации представления ошибки". Я написал страницу с типизированной ошибкой, ранее ожидающую появления System.Exception, а затем, когда я переключился на использование атрибута [HandleError], фильтр передал страницу с ошибкой System.HandleErrorInfo. Второе исключение произошло в этой строке (в Default.aspx.cs):
httpHandler.ProcessRequest(HttpContext.Current);
Непонятный.
Ответ 6
Я столкнулся с подобной проблемой. Я смог получить желаемый результат с помощью этого "взлома".
Поскольку все мои контроллеры расширяют BaseController, это работает везде.
public class BaseController : Controller
{
protected override void OnException(ExceptionContext filterContext)
{
Response.Write("<pre>" + filterContext.Exception.StackTrace + "</pre>");
base.OnException(filterContext);
}
}
Ответ 7
Недавно я столкнулся с подобной проблемой. Оказалось, что метод в контроллере, который генерирует исключение (HomeController), вызывается методом в другом контроллере (DispatchController).
Нам нужно было разместить свойство [HandleError]
на вызывающем контроллере, чтобы заставить его работать.
[HandleError(ExceptionType = typeof(SessionExpireException), View = "ErrorSessionExpired")]
public class DispatchController : Controller
{
Мы также разместили собственное представление ошибок в структуре папок для вызывающего контроллера.
![View folder showing custom error view in the Dispatch controller folder]()