. NET CORE 3.1. Возвращает ли декоратор ApiController json, используя System.Text. Json? - PullRequest
0 голосов
/ 20 апреля 2020

Я конвертирую из. 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);

    }
}

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

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

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

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

Это обеспечивает более согласованную работу браузеров при использовании API.

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

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

0 голосов
/ 22 апреля 2020
    public async Task<JsonResult> TestAsync()
    {
        return Json(someObject);
    }

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

...