Каким должен быть тип возвращаемого значения метода действия WEB API?

Я разрабатываю веб-API ASP.NET с использованием .NET Core. Этот веб-API будет в основном использоваться приложением пользовательского интерфейса (пользовательский интерфейс будет разработан с использованием ASP.NET Core MVC), но в будущем к API могут обращаться и другие приложения.

В моем WEB API все методы асинхронны.

Если я хочу, чтобы клиент выполнял согласование контента, то каким должен быть возвращаемый тип метода действия API Task<IActionresult> или Task<SomePOCO>

Если я хочу, чтобы метод всегда возвращал данные в формате JSON, то каким должен быть возвращаемый тип метода действия API? Должен ли это быть Task<IActionResult> или Task<JsonResult> или Task<SomePOCO>, потому что я думаю, что все 3 будут работать, поэтому не уверен, какой из них подходит здесь?


person LP13    schedule 04.10.2016    source источник
comment
Пожалуйста, не добавляйте теги в заголовок вопроса stackoverflow.com/help/tagging   -  person Tseng    schedule 05.10.2016


Ответы (2)


Если я хочу, чтобы клиент выполнял согласование содержимого, то каким должен быть тип возвращаемого значения метода действия API?

Чтобы выполнить согласование контента, верните Task<ObjectResult> или Task<MyPoco>.

Платформа автоматически упаковывает POCO в ObjectResult; таким образом, оба параметра эквивалентны, и оба будут подчиняться заголовку HTTP Accept. Вы также получите согласование содержимого, вернув любой результат, который реализует ObjectResult, например, OkObjectResult.

Если я хочу, чтобы метод всегда возвращал данные в формате JSON, то каким должен быть тип возвращаемого значения метода действия API?

Чтобы всегда возвращать JSON, возвращайте Task<JsonResult> (или используйте фильтр [Produces]).

См. также: https://docs.asp.net/en/latest/mvc/models/formatting.html#content-negotiation

[S] o Я предполагаю, что IActionResult используется только для контроллера MVC?

IActionResult — это контракт для всех результатов, которые возвращает Controller. Если сигнатура вашего действия имеет возвращаемый тип IActionResult, то тело метода вашего действия может return иметь любой тип результата, потому что все они реализуют интерфейс IActionResult. Вот иерархия наследования.

IActionResult
  ActionResult
    ChallengeResult 
    ContentResult 
    EmptyResult 
    FileResult 
      FileContentResult 
      FileStreamResult 
      PhysicalFileResult 
      VirtualFileResult 
    ForbidResult 
    LocalRedirectResult 
    ObjectResult
      CreatedAtActionResult 
      CreatedAtRouteResult 
      CreatedResult 
      BadRequestObjectResult 
      NotFoundObjectResult 
      OkObjectResult 
    RedirectResult 
    RedirectToActionResult 
    RedirectToRouteResult 
    SignInResult 
    SignOutResult 
    StatusCodeResult 
      NoContentResult 
      NotFoundResult 
      OkResult 
      UnauthorizedResult 
      UnsupportedMediaTypeResult 
      BadRequestResult 

См. также: https://github.com/aspnet/Mvc/tree/dev/src/Microsoft.AspNetCore.Mvc.Core

person Shaun Luttin    schedule 04.10.2016
comment
поэтому я предполагаю, что IActionResult используется только для контроллера MVC? - person LP13; 04.10.2016
comment
@LP13 IActionResult — это интерфейс верхнего уровня. Большинство, если не все результаты реализуют IActionResult. Смотрите правки. - person Shaun Luttin; 04.10.2016

Взгляните на swagger: https://docs.microsoft.com/en-us/aspnet/core/tutorials/web-api-help-pages-using-swagger Для метода лучше указать атрибут ProducesResponseType:

[ProducesResponseType(typeof(TodoItem), 201)]
public IActionResult Create([FromBody, Required] TodoItem item)

Таким образом, автоматически создается документация по чванству, чтобы показать фактические возвращаемые данные для метода.

person Pavel Biryukov    schedule 19.04.2017