.NET CORE 3.1 Возвращает ли декоратор ApiController json с помощью System.Text.Json?

Я конвертирую .NET Core 2.2 в .NET Core 3.1, и я использовал класс JsonApiDotNetCore, чтобы вернуть объект как OK в формате JSON:

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

        return Ok(someObject);

    }
}

Я рассматриваю возможность отхода от JsonApiDotNetCore и использования ControllerBase с декоратором ApiController. Возвращает ли этот декоратор объект, отформатированный в JSON, вместе со статусом HTTP (т.е. OK = 200) с помощью System.Text.Json? Если нет, можно ли использовать это для возврата объекта? Я хочу сделать это таким образом, потому что Microsoft продемонстрировала, что этот новый класс оптимизирован для обеспечения высокой производительности.

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

        return Ok(someObject);

    }
}

person J Weezy    schedule 20.04.2020    source источник


Ответы (2)


Вы получите JSON по умолчанию не из-за атрибута ApiController, а потому, что это поведение по умолчанию при ответе браузеру, если не настроено иное. См. документация:

В отличие от типичных клиентов API, веб-браузеры предоставляют заголовки Accept. Веб-браузер определяет множество форматов, включая подстановочные знаки. По умолчанию, когда фреймворк определяет, что запрос исходит от браузера:

  • Заголовок Accept игнорируется.
  • Если не настроено иное, содержимое возвращается в формате JSON.

Это обеспечивает более единообразное взаимодействие между браузерами при использовании API.

Что делает атрибут ApiControler, хорошо объяснено здесь и здесь. В основном он добавляет проверку, маршрутизацию атрибутов и другие функции. Опять же, подробности смотрите по ссылкам.

Вы также можете проверить исходный код, чтобы найти все ссылки на атрибут, например, в Класс ApiBehaviorApplicationModelProvider - здесь, в методе OnProvidersExecuting.

person PiotrWolkowski    schedule 22.04.2020

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

вы можете вернуть Json с помощью Json ();

person liang.good    schedule 22.04.2020
comment
@lianggood Спасибо за ответ. Использует ли это system.text.json и позволяет ли мне вернуть код состояния HTTP OK (т. Е. 200)? - person J Weezy; 22.04.2020
comment
@JWeezy он не использует system.test.json. он использует собственную json-функцию и автоматически переводит первую букву свойства в нижний регистр. вы можете попробовать с инструментами api post. - person liang.good; 22.04.2020