Usando WebAPI o MVC para devolver JSON en ASP.NET

138

Estoy construyendo una aplicación ASP.NET MVC que es pesada para el script del cliente, usará JSON y jQuery para manipular el DOM.

Mi entendimiento es tanto Controlador Web API y el controlador MVC pueden volver JSON.

Dado mi escenario, ¿debo usar un controlador de API web o un controlador MVC ?

Nil Pun
fuente
1
Es importante tener en cuenta que esta pregunta es específica de un determinado contexto: el autor quiere saber qué controlador usar si SOLO se debe devolver json. Una API REST permite diferentes formatos de medios dependiendo de la negociación de contenido (por ejemplo: aceptar xml, aceptar json). En este caso, el controlador WebAPI es su mejor opción
Sentinel

Respuestas:

156

Los controladores de API web se pueden crear y alojar en cualquier aplicación ASP.NET, no solo en aplicaciones MVC. Por lo tanto, una razón obvia para crear una API web es si no tiene un front-end MVC (por ejemplo, servicios web RESTful clásicos alojados por su empresa / organización).

Los Controladores MVC generalmente se basan en el Marco MVC, si observa las plantillas predeterminadas y la mayoría del trabajo realizado por la comunidad y sus pares, notará que casi todos los Controladores MVC se implementan teniendo en cuenta la Vista.

Personalmente, uso MVC Controllers cuando tengo la intención de responder con una Vista (), y usaré una API web para cualquier cosa que no dependa de una vista en particular.

Existen advertencias, por supuesto, pero en general, si no requiere el comportamiento de enlace de modelo de MVC, su servicio está centrado en los datos y las operaciones están centradas en los datos (por ejemplo, operaciones CRUD), entonces es probable que desee un controlador de API web 'en lugar de un' Controlador de vista de modelo '. Por el contrario, si sus operaciones están centradas en la vista (por ejemplo, entregar una página de administración de usuario al usuario), o si necesita el enlace de modelo de MVC para generar 'parciales ajax' (muy poco probable), entonces querrá un controlador MVC.

Personalmente, uso controladores de API web para manejar clientes RESTful basados ​​en JSON, uso controladores MVC para manejar el enrutamiento básico del navegador y la entrega del SPA.

Shaun Wilson
fuente
32

WebAPI es para hacer una API. Si desea que alguien pueda consumir su API en XML, JSON, etc., puede hacer una API web.

En su caso, solo necesita hablar con el cliente en JSON.

A pesar de que su sitio web se basa principalmente en la secuencia de comandos del cliente, todavía estaría usando ASP.NET MVC Controller, ¿verdad? Y dado que es posible que ya haya dividido lógicamente sus controladores en función de las entidades, entonces tiene sentido agregar esos métodos de publicación json en lugar de crear otra clase específicamente para la API web.

Entonces, para su situación particular (si lo entiendo correctamente), me quedaría con los Controladores.

Muhammad Hasan Khan
fuente
Gracias, ¿hay alguna diferencia en cómo creamos WebAPI vs Controller?
Nil Pun
1
@flybyte sí, debe derivar de ApiController, consulte asp.net/web-api/overview/getting-started-with-aspnet-web-api/…
Muhammad Hasan Khan
44
Web Api puede hacer JSON, así como los otros métodos que enumeres. Los controladores no pueden (claramente) convertirse en una API, por lo tanto, dado que el usuario tiene la previsión de preguntar, sugeriría usar la solución más escalable / flexible. No es como si fuera los servicios WCF de la vieja escuela, la API web es generalmente poderosa y flexible. Entonces, aunque solo necesita escenarios simples, se mantiene fuera de su camino. PERO tienes el poder si lo necesitas
steve
8

La respuesta se reduce a la separación de preocupaciones, fijar la creación de servicios y confiar en la convención en lugar de la configuración.

La responsabilidad principal de los controladores es trabajar como coordinador entre la vista y su modelo, pero la principal responsabilidad de la API es trabajar en los datos. En el caso de las convenciones de API, es muy fácil realizar operaciones CRUD. A continuación se muestra la asignación entre la operación CRUD y las acciones HTTP

  • OBTENER: Leer
  • POST: Crear
  • PUT: Actualización
  • ELIMINAR: Eliminar

Por lo tanto, con las API no tiene que crear acciones separadas y atribuirlas con acciones HTTP.

Kris
fuente
0

La única preocupación que tengo con ApiController es que se basa en el sitio y no en el área. Un sitio solo puede tener una subcarpeta de un controlador para que pueda nombrar sus métodos de controlador. Es posible que desee duplicar el nombre del controlador en diferentes áreas:

domain.com/api/area1/controller1/

domain.com/api/area2/controller1/

Recuerdo que hay algunas configuraciones de código personalizadas para poder hacer esto, pero no funciona de manera predeterminada.

Ramon Chan
fuente
Esto parece un comentario, no una respuesta.
Dylan Hayes
No sé realmente lo que estás diciendo. Si nombra un controlador Area1XController, puede hacer lo siguiente: domain.com/Area1X/1, crear un controlador: Area2XController y luego acceder a él con: domain.com/Area2X/1. La gran pregunta es por qué quieres hacer eso de todos modos. El nombre del área es abstracto, no dice nada a un usuario. Si tiene 4 áreas, entonces es mejor usar el nombre de propósito funcional para ello.
Herman Van Der Blom
0

Estoy de acuerdo con la respuesta de Shaun Wilson (respuesta principal), pero no estoy seguro de por qué, ya que estoy un poco confundido y todavía trato de entender con la siguiente premonición (probablemente incorrecta):

  • Utilice el controlador WebAPI para entregar datos JSON al cliente para que el cliente pueda manejar la manipulación de la vista. Este proceso NO requiere una vista, sino solo una respuesta a lo que se llama el método (es decir, una solicitud de JavaScript) para que el cliente pueda manejar cualquier manipulación del lado del cliente.
  • Use el controlador MVC cuando necesite usar los datos para manipular una vista durante o justo después de page_load (es decir, no para aplicaciones SPA).

Verá, simplemente no sé cómo soy incorrecto aquí y estoy confundido porque la última línea de la respuesta de Shaun dice "Yo uso controladores MVC para manejar el enrutamiento básico del navegador y la entrega del SPA". - tal vez no sé completamente qué es un cliente tranquilo cuando supuse que podría ser un método JavaScript que recibe una respuesta en forma JSON. Esta es la publicación más cercana en Stackoverflow que se relacionó de forma remota como una respuesta a mi pregunta, así que estoy respondiendo esta publicación en lugar de posiblemente duplicar las preguntas.

RH Thorne
fuente
" Use el controlador MVC para entregar la Vista " puede envolver el SPA en parciales MVC para la composición en una Vista. Los desarrolladores de ASP.NET MVC deben entender este concepto. Puede utilizar las instalaciones regulares de Razor + ASP.NET durante la generación de vistas (p. Ej., Procesamiento del lado del servidor) para representar HTML + JS al cliente. El problema que muchos desarrolladores experimentarán aquí es la idea de que los archivos estáticos HTML + JS no son lo que hacen que un SPA sea un SPA. a veces el contenido debe ser dinámico y específico para el usuario, pero todos los marcos tienden a restarle importancia a este hecho. "SPA" y "MVC" no son mutuamente excluyentes.
Shaun Wilson
0

En este escenario, recomendaría WebApi, ya que es perfecto para transferir datos como este basados ​​en solicitudes de Javascript. Por lo general, desarrollaré mis controladores WebApi para que devuelvan un objeto compatible con JSON que luego pueda analizar fácilmente mi Javascript.

El único momento real en el que desearía utilizar una acción en un controlador MVC para este tipo de cosas sería si quisiera generar algo de HTML y reemplazar segmentos de su página con llamadas de Javascript.

Por ejemplo:

Tiene un selector de fecha de la interfaz de usuario de JQuery que, al seleccionarlo, genera una lista de botones de opción que representan eventos en el día elegido.

En este escenario, podría usar WebApi para devolver algunos JSON y luego generar el HTML necesario usando Javascript, pero generalmente es una mala práctica crear mucho HTML usando Javascript. Sería mucho mejor hacer que C # construya el HTML y luego lo devuelva a través de una vista parcial, ya que de esta manera es menos probable que encuentre errores con el análisis de Javascript. Sin mencionar que hace que el HTML sea mucho más fácil de escribir.

jezzipin
fuente