Почему исключения ASP.NET MVC 3 "обрабатываются" дважды?

Я применил обработку исключений, используя приведенный ниже код. [Edited Start] Я не знаю, почему он вызывает просмотр дважды. [Отредактировано Готово]

Basecontroller

public class BaseController : Controller
    {
        protected override void OnException(ExceptionContext filterContext)
        {
            if (filterContext.HttpContext.IsCustomErrorEnabled)
            {
                filterContext.ExceptionHandled = true;

                if (filterContext.Exception.GetType() == typeof(ArgumentOutOfRangeException))
                {
                    this.View("OutOfRange").ExecuteResult(this.ControllerContext);
                }
                else
                {
                    this.View("Error").ExecuteResult(this.ControllerContext);
                }
            }

            base.OnException(filterContext);
        }
    }

HomeController

public class HomeController : BaseController
{
        public ActionResult Exception2()
        {
            throw (new ArgumentOutOfRangeException());
        }

        public ActionResult Exception3()
        {
            throw (new Exception());
        }
}

Просмотр ошибок (только для общей папки)

@model System.Web.Mvc.HandleErrorInfo
@{
    Layout = null;
}
<!DOCTYPE html>
<html>
<head>
    <title>Error</title>
</head>
<body>
    <h2>
        Sorry, an error occurred while processing your request.
    </h2>
    <h3>
        @if (Model != null)
        {
            <p>@Model.Exception.GetType().Name<br />
                thrown in @Model.ControllerName @Model.ActionName</p>
            <br />
            @Model.Exception
        }
    </h3>
</body>
</html>

Просмотр OutOfRange (только для общей папки)

@{
    Layout = null;
}
<!DOCTYPE html>
<html>
<head>
    <title>OutOfRange Exception</title>
</head>
<body>
    <div>
        <h3>
            @if (Model != null)
            {
                <p>@Model.Exception.GetType().Name<br />
                    thrown in @Model.ControllerName @Model.ActionName</p>
                <br />
                @Model.Exception
            }
        </h3>
    </div>
</body>
</html>

URL-адрес выполнения: http://[domainName]/Home/Exception2

Здесь он работает нормально. [EDITED: здесь он также вызывает дважды.]

enter image description here

URL-адрес выполнения: http://[domainName]/Home/Exception3

Здесь не работает нормально. Вы можете видеть, что "Извините, произошла ошибка при обработке вашего запроса". идет дважды. Когда я отлаживаю приложение с использованием вышеуказанного URL-адреса, представление Error отображается дважды (первая модель времени равна нулю, а вторая модель времени содержит некоторое значение). Могу ли я узнать, что не так с моей реализацией? enter image description here

Ответ 1

Что нужно попробовать:

  • Удалите атрибут глобального атрибута HandleError по умолчанию HandleError из вашего Global.asax, если он присутствует. Когда вы создаете новое приложение ASP.NET MVC 3, шаблон по умолчанию регистрирует его внутри метода RegisterGlobalFilters. Итак, закомментируйте строку, которая регистрирует этот атрибут.
  • Включить пользовательские ошибки в файле web.config:

    <customErrors mode="On" />
    

UPDATE:

Если вы хотите передать модель в представление Error.cshtml (так как она строго указана на HandleErrorInfo), вы можете сделать следующее:

else
{
    string controllerName = filterContext.RouteData.GetRequiredString("controller");
    string actionName = filterContext.RouteData.GetRequiredString("action");
    var model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);
    var result = new ViewResult
    {
        ViewName = "Error",
        ViewData = new ViewDataDictionary<HandleErrorInfo>(model)
    };
    filterContext.Result = result;
}

Ответ 2

Добавить base.OnException(filterContext); до if (filterContext.HttpContext.IsCustomErrorEnabled)

      protected override void OnException(ExceptionContext filterContext)
      {
          base.OnException(filterContext);
         if (filterContext.HttpContext.IsCustomErrorEnabled)

      }

Ответ 3

У меня была такая же проблема, но мне удалось решить эту ошибку, добавив:

Response.End();

В конце моего метода OnException.

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