gpt4 book ai didi

asp.net-web-api - MVC 6 WebAPI 返回 html 错误页面而不是异常对象的 json 版本

转载 作者:行者123 更新时间:2023-12-02 14:47:24 24 4
gpt4 key购买 nike

我正在调用 MVC 6 WebAPI 中的 api 端点:

POST http://localhost:57287/mytestapi/testentity/ HTTP/1.1
Accept: application/json
X-APIKey: 00000000-0000-0000-0000-000000000000
Content-Type: application/json; charset=utf-8
Host: localhost:57287
Content-Length: 1837
Expect: 100-continue
Connection: Keep-Alive

在正文中,我有 json 序列化测试实体。

我的实体 Controller 代码中有一个错误,API 返回 500 响应“服务器错误”我知道该错误是什么,并将修复它,但是我需要一些帮助的问题是 API 正在返回 HTML而不是 json 序列化异常对象 - Json 是我所期望的:这是旧的 webapi 将返回的内容。我已经从我知道有效的旧测试项目中移植了代码。

那么为什么 MVC 6 WebAPI 返回 html 而不是 json?我需要做一些配置吗?

编辑:我按照 @danludwig 的建议将 Accept: application/json 添加到 header ,但这并没有解决问题,我仍然收到 html 错误页面。

我查看了我的 StartUp.cs 并发现:

if (env.IsDevelopment())
{
//app.UseBrowserLink();
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}

在ConfigureApp方法中。我用 app.UseDeveloperExceptionPage(); 进行了测试注释掉了。这阻止了 api 响应正文中返回 html 错误页面,但是我仍然没有获取 json 序列化异常对象。

最佳答案

ExceptionHandlerMiddleware使用 UseExceptionHandler("Home/Error") 时配置不包括对 JSON 的任何支持。它只会返回错误 html 页面。使用UseDeveloperExceptionPage时也可以这样说。 .

据我所知,您需要添加一些代码来处理错误并返回 json。

  • 一种选择是使用异常过滤器并将其添加到全局或选定的 Controller 上,尽管这种方法仅涵盖来自 Controller 操作方法的异常。例如,以下过滤器仅当请求接受为 application/json 时才会返回 json 对象(否则它会让异常通过,例如可以由全局错误页面处理):

    public class CustomJSONExceptionFilter : ExceptionFilterAttribute
    {

    public override void OnException(ExceptionContext context)
    {
    if (context.HttpContext.Request.GetTypedHeaders().Accept.Any(header => header.MediaType == "application/json"))
    {
    var jsonResult = new JsonResult(new { error = context.Exception.Message });
    jsonResult.StatusCode = (int)System.Net.HttpStatusCode.InternalServerError;
    context.Result = jsonResult;
    }
    }
    }

    services.AddMvc(opts =>
    {
    //Here it is being added globally.
    //Could be used as attribute on selected controllers instead
    opts.Filters.Add(new CustomJSONExceptionFilter());
    });
  • 另一种选择是使用 app.UseExceptionHandler 重载添加您自己的异常处理程序中间件,该重载可让您指定将处理异常的替代管道的行为。我很快就使用内联中间件编写了一个类似的示例,仅当请求接受为 application/json 时,它才会返回 json 对象:

    if (env.IsDevelopment())
    {
    app.UseDeveloperExceptionPage();
    }
    else
    {
    app.UseExceptionHandler("/Home/Error");
    }

    app.UseExceptionHandler(appBuilder =>
    {
    appBuilder.Use(async (context, next) =>
    {
    var excHandler = context.Features.Get<IExceptionHandlerFeature>();
    if (context.Request.GetTypedHeaders().Accept.Any(header => header.MediaType == "application/json"))
    {
    var jsonString = string.Format("{{\"error\":\"{0}\"}}", excHandler.Error.Message);
    context.Response.ContentType = new MediaTypeHeaderValue("application/json").ToString();
    await context.Response.WriteAsync(jsonString, Encoding.UTF8);
    }
    else
    {
    //I haven't figured out a better way of signally ExceptionHandlerMiddleware that we can't handle the exception
    //But this will do the trick of letting the other error handlers to intervene
    //as the ExceptionHandlerMiddleware class will swallow this exception and rethrow the original one
    throw excHandler.Error;
    }
    });
    });

这两种方法都可以让您拥有其他错误处理程序,这些错误处理程序可能为非 json 请求提供 html 页面(另一个想法是从自定义错误处理程序返回 json 或 html 页面)。

PS。如果使用第二种方法,您很可能希望将该逻辑放入其自己的中间件类中,并使用不同的方法来生成 json 响应。在这种情况下看看什么 JsonResultExecutor确实

关于asp.net-web-api - MVC 6 WebAPI 返回 html 错误页面而不是异常对象的 json 版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35245893/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com