.NET CORE 3.1 ApiController 装饰器 return json 使用 System.Text.Json 吗?

.NET CORE 3.1 Does ApiController decorator return json using System.Text.Json?

我正在从 .NET Core 2.2 转换到 .NET Core 3.1,并且我一直在使用 JsonApiDotNetCore class 到 return 对象在 JSON 中正常格式:

public class ClientsController : JsonApiController<Client>
{
    [AllowAnonymous]
    [HttpGet("/Route/Page")]
    public async Task<ActionResult> TestAsync()
    {
        // Do some stuff

        return Ok(someObject);

    }
}

我正在考虑可能离开 JsonApiDotNetCore 并使用带有 ApiController 装饰器的 ControllerBase。这个装饰器 return 是在 JSON 中格式化的对象以及使用 System.Text.Json 的 HTTP 状态(即 OK = 200)吗?如果没有,是否可以将其用于 return 对象?我想这样做是因为微软已经证明这个新的 class 针对高性能进行了优化。

public class ClientsController : ControllerBase
{
    [ApiController]
    [AllowAnonymous]
    [HttpGet("/Route/Page")]
    public async Task<ActionResult> TestAsync()
    {
        // Do some stuff

        return Ok(someObject);

    }
}
    public async Task<JsonResult> TestAsync()
    {
        return Json(someObject);
    }

您可以使用 Json();

return Json

默认情况下您将获得 JSON 不是因为 ApiController 属性,而是因为它是响应浏览器时的默认行为,除非另有配置。详情见documentation

Unlike typical API clients, web browsers supply Accept headers. Web browser specify many formats, including wildcards. By default, when the framework detects that the request is coming from a browser:

  • The Accept header is ignored.
  • The content is returned in JSON, unless otherwise configured.

This provides a more consistent experience across browsers when consuming APIs.

很好地解释了 ApiControler 属性的作用 and here。基本上它添加了验证、属性路由和其他功能。同样,请参阅链接了解详情。

您还可以检查源代码以找到对属性的所有引用,例如 ApiBehaviorApplicationModelProvider class - 这里的 OnProvidersExecuting 方法。