with tutorial started net mvc example asp apicontroller c# asp.net asp.net-mvc asp.net-core asp.net-core-mvc

tutorial - web api json c#



¿Cuál es la diferencia entre MVC Controller y Web API Controller en ASP.NET MVC 6? (2)

En ASP.NET 5 MVC 6, Microsoft combinó la clase de controlador MVC normal ( Controller ) con la clase de controlador Web Api ( ApiController ). Ahora solo hay una clase de Controller para heredar, que también incluye las características de WebApi.

Así que ahora no es tan sencillo distinguir los controladores MVC y WebApi. Ambos heredan de la clase Controller . La única diferencia que puedo detectar es que la información de enrutamiento de WebApi aún es proporcionada por los atributos HttpGet , HttpPost , HttpPut y HttpDelete . Pero ahora es posible hacer lo mismo con los controladores MVC usando enrutamiento de atributos, solo con atributos diferentes.

Incluso las características parecen haberse fusionado. Los controladores MVC también admiten la negociación de contenido ahora.

Las preguntas concretas son:

¿Todavía hay una diferencia real, o es solo la forma en que se especifican las rutas? ¿En qué sentido es ahora el preferido para crear aplicaciones web?

(Casi) controlador MVC vacío:

public class HomeController : Controller { public List<Person> Index() { return new List<Person>() { new Person() {Firstname = "test1", Lastname = "test2"}, new Person() {Firstname = "test3", Lastname = "test4"} }; } public IActionResult About() { ViewData["Message"] = "Your application description page."; return View(); } public IActionResult Contact() { ViewData["Message"] = "Your contact page."; return View(); } public IActionResult Error() { return View("~/Views/Shared/Error.cshtml"); } }

(Casi) vacío controlador de WebApi:

[Route("api/[controller]")] public class ValuesController : Controller { // GET: api/values [HttpGet] public IEnumerable<Person> Get() { return new List<Person>() { new Person() {Firstname = "test1", Lastname = "test2"}, new Person() {Firstname = "test3", Lastname = "test4"} }; } // GET api/values/5 [HttpGet("{id}")] public string Get(int id) { return "value"; } // POST api/values [HttpPost] public void Post([FromBody]string value) { } // PUT api/values/5 [HttpPut("{id}")] public void Put(int id, [FromBody]string value) { } // DELETE api/values/5 [HttpDelete("{id}")] public void Delete(int id) { } }

EDITAR:

Si desea probar si la negociación de contenido funciona, debe incluir este código en su método Startup.ConfigureServices, ya que, por defecto, el tipo de retorno es solo JSON.

services.Configure<MvcOptions>(options => { options.AddXmlDataContractSerializerFormatter(); });


Creo que estás pensando demasiado en esto.

Su primera pregunta "¿Cuál es la diferencia entre MVC Controller y Web API Controller en ASP.NET MVC 6?" presupone que son diferentes, pero no lo son. Se fusionan, por lo que no hay diferencia.

Si desea definir rutas separadas para acordonar sus métodos de acción que no devuelven Ver resultados, entonces hágalo. Depende de usted cómo organizar su aplicación. Preguntando "¿Cuál es el camino preferido para crear aplicaciones web?" no tiene sentido, ya que depende de usted decidir su aplicación, y no habrá una forma más común de hacer las cosas hasta después de que MVC 6 haya estado en uso de producción durante un buen tiempo.


Si bien Mason respondió la pregunta a la perfección, quiero proporcionar información adicional sobre las diferencias y algunos recursos que esperamos ayuden a los futuros visitantes de la pregunta.

Microsoft fusionó ApiController y Controller en una clase, Controller . Para hacer eso, eliminaron algunas características del ApiController .

This es una gran publicación en el blog que describe los cambios.

Por ejemplo, en lugar de especificar la HTTP Action como prefijo del método del parámetro y la ruta en un atributo de ruta, ambos se realizan ahora con los atributos HttpGet y HttpPost .

[HttpGet("api/visits")]

Si desea migrar desde el proyecto WebApi , here hay una guía para hacerlo.

Si no desea migrar, pero simplemente desea convertir el proyecto a la nueva versión de ASP.NET MVC , puede usar el Web API Compatibility Shim . Here y here encuentras orientación para eso.