Hola a todos, una de las nuevas características que me ha gustado mucho de Web API 2 es que ahora podemos definir como respuesta un IHttpActionResult, y esto básicamente reemplaza a las respuesta con HttpResponseMessage y nos hace la vida mucho más fácil.

Así que iniciemos, partimos de un modelo muy sencillo:

public class Person { public int Id { get; set; } public string Name { get; set; } public string LastName { get; set; } public string Twitter { get; set; } }

y un contexto:

public class PersonDBContext : DbContext { public DbSet Person { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); } }

Ahora, añadimos un nuevo item, primero seleccionamos* New Scaffolded Item*:

IHttpResult1

Luego Web API 2 Controller with actions, using Entity Framework:

IHttpResult2

Y finalmente le damos un nombre, seleccionamos el modelo y el contexto (dejamos para otro post la casilla Use async controller actions):

IHttpResult3

Y el resultado es:

public class PersonController : ApiController { private PersonDBContext db = new PersonDBContext(); // GET api/Person public IQueryable GetPerson() { return db.Person; } // GET api/Person/5 [ResponseType(typeof(Person))] public IHttpActionResult GetPerson(int id) { Person person = db.Person.Find(id); if (person null) { return NotFound(); } return Ok(person); } // PUT api/Person/5 public IHttpActionResult PutPerson(int id, Person person) { if (!ModelState.IsValid) { return BadRequest(ModelState); } if (id != person.Id) { return BadRequest(); } db.Entry(person).State = EntityState.Modified; try { db.SaveChanges(); } catch (DbUpdateConcurrencyException) { if (!PersonExists(id)) { return NotFound(); } else { throw; } } return StatusCode(HttpStatusCode.NoContent); } // POST api/Person [ResponseType(typeof(Person))] public IHttpActionResult PostPerson(Person person) { if (!ModelState.IsValid) { return BadRequest(ModelState); } db.Person.Add(person); db.SaveChanges(); return CreatedAtRoute("DefaultApi", new { id = person.Id }, person); } // DELETE api/Person/5 [ResponseType(typeof(Person))] public IHttpActionResult DeletePerson(int id) { Person person = db.Person.Find(id); if (person null) { return NotFound(); } db.Person.Remove(person); db.SaveChanges(); return Ok(person); } protected override void Dispose(bool disposing) { if (disposing) { db.Dispose(); } base.Dispose(disposing); } private bool PersonExists(int id) { return db.Person.Count(e => e.Id == id) > 0; } }

Ahora, revisando el controlador anterior, notamos que ahora la respuesta de las acciones es un IHttpActionResult, y en esencia la respuesta ahora es mucho más simple para construir, ya que podemos retornar directamente el “resultado” de la operación utilizando los siguientes métodos:

  • Ok()
  • BadRequest()
  • NotFound()

Saludos!