Почему исключения 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
Что нужно попробовать:
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.
Я знаю, что это не идеальное разрешение, но, по крайней мере, оно вытащило меня из привязки до тех пор, пока я не смогу исследовать более полный вариант.