如何在 ASP.NET MVC 中以 JSON 格式返回 500 错误?
Posted
技术标签:
【中文标题】如何在 ASP.NET MVC 中以 JSON 格式返回 500 错误?【英文标题】:How can I return 500 error in JSON format in ASP.NET MVC? 【发布时间】:2011-08-15 09:29:30 【问题描述】:当 ASP.NET MVC 抛出异常时,它会返回响应类型为 text/html
的 500 错误——当然,这是无效的 JSON。
我想响应一个期望 JSON 的 Ajax 请求,但我可以接收到错误并显示给用户。
是否可以返回 HTTP 状态码为 500 的 JSON?
当问题是缺少参数时,甚至在调用控制器之前就会发生 500 错误 - 因此控制器解决方案可能不起作用。例如,在对通常返回 JsonResult 的 Action 的调用中保留所需参数,ASP.NET MVC 会将其发送回客户端:
“/”应用程序中的服务器错误。参数字典包含一个 不可为空类型“System.Int32”的参数“id”的空条目 方法'System.Web.Mvc.JsonResult EditUser(Int32, System.String, 系统字符串,系统字符串,系统字符串,系统字符串, System.String, System.String, System.String)' 在 'bhh' 中。一个可选的 参数必须是引用类型、可为空的类型或声明为 一个可选参数。参数名称:参数
我正在使用 jQuery;有没有更好的方法来处理这个问题?
【问题讨论】:
【参考方案1】:您可以使用自定义错误处理程序过滤器:
public class AjaxErrorHandler : FilterAttribute, IExceptionFilter
public void OnException(ExceptionContext filterContext)
if (filterContext.HttpContext.Request.IsAjaxRequest())
filterContext.ExceptionHandled = true;
filterContext.Result = new JsonResult
Data = new errorMessage = "some error message"
;
然后装饰您通过 Ajax 调用的控制器/动作,甚至注册为全局过滤器。
那么在执行ajax请求的时候就可以测试error属性的存在了:
$.getJSON('/foo', function(result)
if (result.errorMessage)
// Something went wrong on the server
else
// Process as normally
);
【讨论】:
很抱歉,但我知道,只要响应是无效的 json,我如何使用 jQuery 解析客户端的确切错误。我可以使用正则表达式解析斜体吗 @jQuery On Planet mysql,为什么响应会是无效的 JSON? 我不返回但 ASP.NET MVC 返回 $.trim($(data).filter(":gt(2)").text().split('\n\n') [3]) 尝试返回内容。它解析错误 另一种选择是添加行filterContext.HttpContext.Response.StatusCode = 500;
,然后使用 error: function(error) ...
在 JSON 调用上设置错误处理程序。在我看来,这将是一个更简洁的选择,因为错误由错误处理程序处理......以上是关于如何在 ASP.NET MVC 中以 JSON 格式返回 500 错误?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 JSON.NET 通过 ASP.NET MVC 传递 JSON 日期值? [复制]
我应该通过 ASP.NET MVC 操作还是 WCF 公开 Web 方法?
如何在 ASP.NET MVC/Web 控制器中返回 JSON?