net mvc example await async asp c# asp.net asp.net-web-api async-await asp.net-web-api2

c# - mvc - Devolver IHttpActionResult vs IEnumerable<Item> versus IQueryable<Item>



web api async controller (2)

Debería devolver IHttpActionResult porque puede ser más específico para el cliente. Puede crear aplicaciones web más amigables para el usuario. Básicamente puede devolver diferentes mensajes de estado HTML para diferentes situaciones.

Por ejemplo:

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

IQueryable y IEnumerable simplemente analizarán sus datos en el formato de salida y no tendrá una forma adecuada de manejar excepciones. Esa es la diferencia más importante.

En ASP.NET Web API 2, ¿cuál es la diferencia entre los siguientes?

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

y

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

y

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

¿Debo devolver IHttpActionResult o IEnumerable<MyItem> / IQueryable<MyItem> ?


Escogería entre IEnumerable y IHttpActionResult, con las dos cosas se puede hacer prácticamente lo mismo. IQueryable se usa generalmente para tareas de acceso a datos de nivel inferior y para la ejecución diferida de consultas SQL, de modo que lo mantendría encapsulado dentro de las clases de acceso a datos y no lo expondría con la API web.

Aquí hay un resumen de http://www.asp.net/web-api/overview/web-api-routing-and-actions/action-results :

IHttpActionResult

La interfaz IHttpActionResult se introdujo en Web API 2. Básicamente, define una fábrica HttpResponseMessage. Estas son algunas ventajas de usar la interfaz IHttpActionResult (sobre la clase HttpResponseMessage) :

  • Simplifica la unidad de prueba de sus controladores.
  • Mueve la lógica común para crear respuestas HTTP en clases separadas.
  • Mejora la intención de la acción del controlador al ocultar los detalles de bajo nivel de la construcción de la respuesta.

IEnumerable <Item>

Para todos los demás tipos de devolución, la API web utiliza un formateador de medios para serializar el valor devuelto. Web API escribe el valor serializado en el cuerpo de la respuesta. El código de estado de respuesta es 200 (OK).

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

Una desventaja de este enfoque es que no puede devolver un código de error directamente, como 404. Sin embargo, puede arrojar una HttpResponseException para los códigos de error. Para más información.