Подтвердить что ты не робот

Возврат IHttpActionResult против IEnumerable <Item> vs IQueryable <Item>

В ASP.NET WebApi 2 существует разница между следующим:

    public async Task<IEnumerable<MyItem>> GetMyItems()
    {
        //... code ..., var myItems = await ...
        return myItems;
    }

и

    public async Task<IQueryable<MyItem>> GetMyItems()
    {
        //... code ..., var myItems = await ...
        return myItems;
    }

и

    public async Task<IHttpActionResult> GetMyItems()
    {
        //... code ..., var myItems = await ...
        return Ok(myItems);
    }

Должен ли я возвращать IHttpActionResult или IEnumerable<MyItem>/IQueryable<MyItem>?

4b9b3361

Ответ 1

Вы должны вернуть IHttpActionResult, потому что вы можете быть более конкретным для клиента. Вы можете создавать более удобные веб-приложения. В основном вы можете возвращать различные сообщения статуса HTML для разных ситуаций.

Например:

public async Task<IHttpActionResult> GetMyItems()
{
    if(!authorized)
        return Unauthorized();
    if(myItems.Count == 0)
        return NotFound();
    //... code ..., var myItems = await ...
    return Ok(myItems);
}

IEnumerable и IQueryable будут просто анализировать ваши данные в формате вывода, и у вас не будет надлежащего способа обработки исключений. Это самая важная разница.

Ответ 2

Я бы выбрал между IEnumerable и IHttpActionResult, вы можете сделать почти то же самое с обоими из них просто несколькими способами. IQueryable обычно используется для задач доступа к более низким уровням данных и отложенного выполнения запросов sql, поэтому я бы сохранил его инкапсулированным в ваших классах доступа к данным и не раскрыл его с помощью веб-api.

Здесь резюме из http://www.asp.net/web-api/overview/web-api-routing-and-actions/action-results:

IHttpActionResult

Интерфейс IHttpActionResult был введен в Web API 2. По сути, он определяет HttpResponseMessage factory. Вот некоторые преимущества использования интерфейса IHttpActionResult (над классом HttpResponseMessage):

  • Упрощает модульное тестирование ваших контроллеров.
  • Перемещает общую логику для создания ответов HTTP в отдельные классы.
  • Делает задачу действий контроллера более ясной, скрывая детали низкого уровня построения ответа.

IEnumerable < & товара GT;

Для всех других типов возвращаемых данных Web API использует форматформат для сериализации возвращаемого значения. Web API записывает сериализованное значение в тело ответа. Код состояния ответа - 200 (OK).

public class ProductsController : ApiController
{
    public IEnumerable<Product> Get()
    {
        return GetAllProductsFromDB();
    }
}

Недостатком такого подхода является то, что вы не можете напрямую вернуть код ошибки, например 404. Однако вы можете вывести исключение HttpResponseException для кодов ошибок. Для получения дополнительной информации.