ASP.NET MVC HandleError не работает (для customErrors установлено значение «On») - PullRequest
15 голосов
/ 16 июня 2009

Мне кажется, я настроил наше приложение MVC для правильного использования [HandleError]. Это мой контроллер:

[HandleError]
public class SupportController : BaseController {

    public ActionResult Toss() {
        throw new Exception("uh oh");
    }
    // snip
}

И у меня есть , установите для моего тега customErrors в web.config значение "Вкл.":

<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 по мере их выпуска. Может быть, оттуда остались какие-то странные настройки?

Я могу заставить это работать в других приложениях, так что я немного сбит с толку.

Ответы [ 7 ]

19 голосов
/ 17 июня 2009

Это имеет место, если возникает проблема с обработкой страницы ошибки. Если вы отлаживаете приложение, сразу после первоначального исключения вы столкнетесь с другим (исключение со страницы ошибки). Причиной для меня было то, что у меня была строго типизированная главная страница, страница ошибок использовала эту главную страницу, и поскольку главная страница имела ту же модель, что и настоящая страница, главная страница получала модель HandlerErrorInfo вместо типизированной модели I ожидается ..

Лично я думаю, что это плохой дизайн в mvc asp.net (вместе с остальным), но вы можете обойти это достаточно просто, не используя ту же главную страницу (вы могли бы даже сделать наследование главной страницы там, где вы иметь унаследованную строго типизированную главную страницу, которая просто наследует слой от нетипизированного.

В противном случае это какое-то исключение, возникающее в представлении ошибки .. (скорее всего).

3 голосов
/ 03 марта 2012

Если вы используете IE9, есть другая проблема. Кажется, IE9 скрывает страницу ошибки, если она меньше 1 Кб, как сказано в:

жерех-нетто-3-MVC-HandleError-глобально-фильтр-всегда-шоу-МИС-статус-500-страница

Убедитесь, что длина содержимого содержимого превышает 1 КБ. Попробуйте добавить это в конце страницы с ошибкой:

@ (новая строка ('', 1000))

2 голосов
/ 27 июля 2009

Другая причина этой проблемы может быть

В шаблонном приложении MVC (создан VS2008 / VS2008 Express) Error.aspx (создан VS) использует главную страницу.

Если главная страница получит доступ к каким-либо данным ViewData, она выдаст исключение с нулевой ссылкой, тогда ошибка.

Используйте этот простой код в качестве Error.aspx, он решит проблему (вместе с CustomErrors = On)

<%@ Page Language="C#"  Inherits="System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo>" %>
<%= Model.Exception.Message %>
1 голос
/ 08 января 2015

Недавно я столкнулся с подобной проблемой. Оказалось, что метод в контроллере, который выдает исключение (HomeController), вызывается методом в другом контроллере (DispatchController).

Нам пришлось разместить свойство [HandleError] на вызывающем контроллере, чтобы заставить его работать.

[HandleError(ExceptionType = typeof(SessionExpireException), View = "ErrorSessionExpired")]
public class DispatchController : Controller
{

Мы также поместили настраиваемое представление ошибок в структуру папок для вызывающего контроллера.
View folder showing custom error view in the Dispatch controller folder

1 голос
/ 09 июля 2010

У меня была такая же проблема, и после расследования я обнаружил, что обновляю файл web.Debug.config в web.config.

Затем я создал тег CustomErrors в файле web.config, и он работал для меня.

0 голосов
/ 20 января 2012

Я продолжал сталкиваться с подобной проблемой. Я смог получить желаемый результат с этим "взломом".

Поскольку все мои контроллеры расширяют BaseController, это работает везде.

<code>public class BaseController : Controller
{
    protected override void OnException(ExceptionContext filterContext)
    {

        Response.Write("<pre>" + filterContext.Exception.StackTrace + "
"); base.OnException (filterContext); } }
0 голосов
/ 18 ноября 2009

После долгих попыток я обнаружил, что моя проблема подпадает под общую категорию «выбрасывать исключение только из кода, чтобы вызвать еще одну ошибку при рендеринге представления ошибок». Ранее я писал страницу с ошибками со строгим типом данных, ожидая исключения System.Exception, затем, когда я переключился на использование атрибута [HandleError], фильтр передавал странице ошибки System.HandleErrorInfo. Второе исключение произошло в этой строке (в Default.aspx.cs):

httpHandler.ProcessRequest(HttpContext.Current);

Смешение.

...