如何在 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?

如何在asp.net mvc中返回复杂的Json对象

ASP.NET MVC 如何将 ModelState 错误转换为 json

如何从 ASP.NET MVC 控制器方法返回由 JSON.NET 序列化的 camelCase JSON?