【问题标题】:Returning JSON Errors from Asp.Net MVC 6 API从 Asp.Net MVC 6 API 返回 JSON 错误
【发布时间】:2015-05-11 08:49:18
【问题描述】:

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

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

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

    // Add MVC to the request pipeline.
    app.UseMvc();

我想进行通用设置。是否有“正确/最佳”的方式在 MVC 6 中为 API 进行设置?

谢谢...

【问题讨论】:

    标签: json asp.net-web-api asp.net-core asp.net-core-mvc


    【解决方案1】:

    实现您的方案的一种方法是编写ExceptionFilter 并在其中捕获必要的详细信息并将Result 设置为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 =>
    {
        services.AddMvc();
        services.Configure<MvcOptions>(options =>
        {
            options.Filters.Add(new CustomExceptionFilterAttribute());
        });
    .....
    }
    

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

    【讨论】:

    • 所以我看到的其他方法是:#1:在基本控制器中覆盖 OnActionExecuted。 #2: app.UseErrorHandler("/Home/Error") 去一个控制器方法来处理错误。他们都工作,但都显得有点傻。这种方法似乎更好,但是由于 URL 错误,这三种方法都不能处理简单的 404。这在任何这些开始之前就被捕获了。有没有办法拦截所有错误?
    • 感谢您的信息。我不确定方法#1,必须检查。方法#2 似乎是在 ErrorHandler 中间件之后注册的任何中间件的通用解决方案,并且当当前请求发生异常时,它被重新路由到不同的 url 来处理它。看源码貌似这样也没有处理formatter write相关的异常。
    • 关于捕获 404 响应的问题。这些通常不被视为异常,但如果您也想捕获这些,那么我能想到的一些选项是:1)在路由集合末尾注册的包罗万象的路由,当被击中时确认没有您的路由集合中的先前路由匹配并且 2)位于 MVC 之前的中间件,但问题是您无法区分从 MVC 返回的 404 是由于不正确的 URL 还是由于操作返回 404 作为产品未找到具有给定 ID 的。
    • 这基本上可以工作,但会返回一个 200 状态码,这是不希望的。你能用 CustomExceptionFilterAttribute 返回一个 500 吗?
    • @Hinrich 可以像这样指定JsonResult对象的StatusCode var jsonResult = new JsonResult(exception); jsonResult.StatusCode = (int)HttpStatusCode.InternalServerError;
    猜你喜欢
    • 1970-01-01
    • 2016-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 2010-12-04
    • 2011-08-03
    相关资源
    最近更新 更多