抛出未处理的错误500异常时返回JSON

时间:2017-10-16 15:17:00

标签: asp.net asp.net-mvc

如果ASP.NET MVC中存在未处理的服务器错误500,则服务器返回如下所示的HTML页面:

enter image description here

问题:是否可以配置应用程序,使其返回具有相同信息的JSON而不是上述HTML?

例如:

if (!Scriptable.class.isAssignableFrom(type)) {
    throw new MyChosenException();
}

2 个答案:

答案 0 :(得分:0)

你需要捕获一些适当的错误[我建议在控制器上使用自定义错误过滤器,例如继承自HandleErrorAttribute],并覆盖OnException方法,从那里你可以检查它是否是Ajax,然后做其他事情,这里是我之前写过的片段(还不干净) 并且不要忘记设置状态代码!

 if (filterContext.HttpContext.Request.IsAjaxRequest())
        {
            JsonResultObject result = new JsonResultObject();
            result.Success = false;
            string message = ("Common.WeAreFixing" + " , #" + errorLog.Id.ToString("00000"));
            if (filterContext.HttpContext.Request.IsLocal)
            {
                message = filterContext.Exception.Message + Environment.NewLine + "st: " +
                          (filterContext.Exception.StackTrace ?? "");
            }
            result.AlertMessage = new Alert(message, Alert.Type.Error);

            filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
            filterContext.Result = new JsonDotNetResult()
            {
                JsonRequestBehavior = JsonRequestBehavior.AllowGet,
                Data = result
            };
            filterContext.HttpContext.Items["ErrorNumber"] = errorLog.Id.ToString("00000");
        }

答案 1 :(得分:0)

在异常情况下,敏感信息包括不应泄露给消费者的堆栈详细信息,但是当您显示错误屏幕时,我认为这是在调试环境中运行而不是问题。

同样在非调试环境中,可能会从响应中删除异常详细信息,因此理想情况下,您应该根据该异常形成Json格式的自定义消息,然后记录原始堆栈详细信息,以便您可以在以后的日期。

下面的内容应该让你开始:

    try
    {
        // do some work
    }
    catch (ExplicitException ex)
    {
        // Log the exception(ex);

        var message = "Error Doing Work");
        return Json(new { status = "Error", message });
    }
}