Возврат 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>
?
Ответы
Ответ 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 для кодов ошибок. Для получения дополнительной информации.