为什么ASP.NET MVC 3周的例外是“处理”两次?(Why are ASP.NET MVC 3

2019-06-26 00:32发布

我曾尝试使用下面的代码。[编辑开始]我不知道为什么它在调用视图两次实现异常处理。 [编辑完成]

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>

执行网址: http://[domainName]/Home/Exception2

这是工作的罚款。 [编辑:这也叫了两次。]

执行网址: http://[domainName]/Home/Exception3

这是行不通的罚款。 你可以看到,“对不起,发生了错误处理您的请求。” 来了两次。 当我调试使用上述的URL,称为错误视图应用两次(第一次模型是空和第二时间模型包含一些值)。 我想知道什么是错我的执行?

Answer 1:

您可以尝试:

  1. 删除默认HandleError从全局动作过滤器属性Global.asax如果存在的话。 当你创建一个新的ASP.NET MVC 3应用程序的默认模板注册它里面RegisterGlobalFilters方法。 所以注释掉注册这个属性就行了。
  2. 启用你的web.config的自定义错误:

     <customErrors mode="On" /> 

更新:

如果你想传递一个模型来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;
}


Answer 2:

加入base.OnException(filterContext); 之前if (filterContext.HttpContext.IsCustomErrorEnabled)

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

      }


Answer 3:

我有同样的问题,但我设法通过增加来解决该错误:

Response.End();

我的onException的方法结束。

我知道这不是理想的分辨率,但是,它也至少让我离开困境,直到这样的时刻,我可以研究更完整的选项。



文章来源: Why are ASP.NET MVC 3 exceptions being 'handled' twice?