从Asp.NETMVC6API返回JSON错误

从Asp.NETMVC6API返回JSON错误,json,asp.net-web-api,asp.net-core,asp.net-core-mvc,Json,Asp.net Web Api,Asp.net Core,Asp.net Core Mvc,我正在尝试用MVC6构建一个web API。但是,当我的一个控制器方法抛出错误时,响应的内容是一个格式非常好的HTML页面,如果这是一个MVC应用程序,它将提供非常丰富的信息。但由于这是一个API,我宁愿返回一些JSON 注意:我的设置现在是超级基本的,只需设置: app.UseStaticFiles(); app.UseIdentity(); // Add MVC to the request pipeline. app.UseMvc(); 我想建立一个通用

我正在尝试用MVC6构建一个web API。但是,当我的一个控制器方法抛出错误时,响应的内容是一个格式非常好的HTML页面,如果这是一个MVC应用程序,它将提供非常丰富的信息。但由于这是一个API,我宁愿返回一些JSON

注意:我的设置现在是超级基本的,只需设置:

    app.UseStaticFiles();
    app.UseIdentity();

    // Add MVC to the request pipeline.
    app.UseMvc();
我想建立一个通用的系统。在MVC6中是否有一种“正确/最佳”的方式来设置API


谢谢…

实现场景的一种方法是编写一个
例外过滤器
,在该过滤器中捕获必要的细节,并将
结果设置为
JsonResult

// Here I am creating an attribute so that you can use it on specific controllers/actions if you want to.
public class CustomExceptionFilterAttribute : ExceptionFilterAttribute
{
    public override void OnException(ExceptionContext context)
    {
        var exception = context.Exception;
        context.Result = new JsonResult(/*Your POCO type having necessary details*/)
        {
            StatusCode = (int)HttpStatusCode.InternalServerError
        };
    }
}
您可以添加此异常筛选器以适用于所有控制器。 例如:

app.UseServices(服务=>
{
services.AddMvc();
配置(选项=>
{
options.Filters.Add(新的CustomExceptionFilterAttribute());
});
.....
}

请注意,此解决方案并不涵盖所有场景……例如,当格式化程序在编写响应时引发异常时。

因此,我看到的其他方法是:#1:重写在基本控制器中执行的OnAction。和#2:app.UseErrorHandler(“/Home/Error”)转到控制器方法来处理错误。它们都可以工作,但都有点笨拙。这种方法似乎更好,但三者都无法处理简单的404,例如,由于url错误。这会在这些错误出现之前被捕获。有没有办法截获所有错误?感谢提供的信息。我不确定方法#1,并且会必须检查。方法#2似乎是在ErrorHandler中间件之后注册的任何中间件的通用解决方案,当当前请求发生异常时,它将被重新路由到不同的url以处理它。查看源代码,这似乎也不会处理格式化程序写入相关的异常关于捕获404个响应的问题。这些通常不被视为例外,但如果您也想捕获这些响应,那么我可以想到的一些选项是:1)在路由集合末尾注册的一个“全包”路由,当它被命中时,确认路由集合中以前的路由都不匹配;2)位于MVC之前的一个中间件,但问题是,您无法区分从MVC返回的404是由于不正确的Url导致的,还是说找不到将404作为具有给定id的产品返回的操作。这基本上是可行的,但将返回200状态码,这应该是不需要的。您可以使用CustomExceptionFilterAttribute返回一个500吗?@Hinrich您可以像这样指定JsonResult对象的状态码
var JsonResult=new JsonResult(异常);jsonResult.StatusCode=(int)HttpStatusCode.InternalServerError
app.UseServices(services =>
{
    services.AddMvc();
    services.Configure<MvcOptions>(options =>
    {
        options.Filters.Add(new CustomExceptionFilterAttribute());
    });
.....
}