如果ASP.NET MVC中存在未处理的服务器错误500,则服务器返回如下所示的HTML页面:
问题:是否可以配置应用程序,使其返回具有相同信息的JSON而不是上述HTML?
例如:
if (!Scriptable.class.isAssignableFrom(type)) {
throw new MyChosenException();
}
答案 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 });
}
}