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