Diferencia entre ApiController y Controller en ASP.NET MVC

He estado jugando con ASP.NET MVC 4 beta y veo dos tipos de controladores ahora: ApiController y Controller .

Estoy un poco confundido en qué situaciones puedo elegir un controlador en particular.

Por ejemplo: si quiero devolver una vista, entonces tengo que usar ApiController o el Controller ordinario. Soy consciente de que la API web WCF ahora está integrada con MVC.

Como ahora podemos usar ambos controladores, alguien puede señalar en qué situaciones ir para el controlador correspondiente.

Usa el controlador para mostrar tus vistas normales. La acción ApiController solo devuelve datos que se serializan y se envían al cliente.

aqui esta el link

Citar:

Nota Si ha trabajado con ASP.NET MVC, entonces ya está familiarizado con los controladores. Funcionan de manera similar en la API web, pero los controladores en la API web derivan de la clase ApiController en lugar de la clase Controller. La primera diferencia importante que notará es que las acciones en los controladores Web API no devuelven vistas, sino que devuelven datos.

ApiControllers están especializados en la devolución de datos. Por ejemplo, se encargan de serializar de forma transparente los datos en el formato solicitado por el cliente. Además, siguen un esquema de enrutamiento diferente por defecto (como en: mapeo de URL a las acciones), proporcionando una API REST-ful por convención.

Probablemente puedas hacer cualquier cosa usando un Controlador en lugar de un ApiController con la encoding manual (?). Al final, ambos controladores se basan en la base de ASP.NET. Pero tener una API REST-ful es un requisito tan común hoy en día que la WebAPI se creó para simplificar la implementación de una API de este tipo.

Es bastante simple decidir entre los dos: si está escribiendo una aplicación web / internet / intranet basada en HTML, tal vez con la llamada AJAX ocasional que vuelve json aquí y allá, quédese con MVC / Controller. Si desea proporcionar una interfaz basada en datos / REST-ful a un sistema, vaya con WebAPI. Puede combinar ambos, por supuesto, tener un ApiController atender llamadas AJAX desde una página MVC.

Para dar un ejemplo del mundo real: actualmente estoy trabajando con un sistema ERP que proporciona una API REST-ful a sus entidades. Para esta API, WebAPI sería un buen candidato. Al mismo tiempo, el sistema ERP proporciona una aplicación web altamente AJAX que puede usar para crear consultas para la API REST-ful. La aplicación web en sí misma podría implementarse como una aplicación MVC, haciendo uso de la WebAPI para buscar metadatos, etc.

¿Qué prefieres escribir y mantener?

ASP.NET MVC

 public class TweetsController : Controller { // GET: /Tweets/ [HttpGet] public ActionResult Index() { return Json(Twitter.GetTweets(), JsonRequestBehavior.AllowGet); } } 

API web ASP.NET

 public class TweetsController : ApiController { // GET: /Api/Tweets/ public List Get() { return Twitter.GetTweets(); } } 

Me encanta el hecho de que MVC6 de ASP.NET Core fusionó los dos patrones en uno porque a menudo necesito admitir ambos mundos. Si bien es cierto que puedes ajustar cualquier Controller MVC estándar (y / o desarrollar tus propias clases ActionResult ) para actuar y comportarse como un ApiController , puede ser muy difícil de mantener y probar: además de eso, tener métodos de control regresando ActionResult mezclado con otros datos devueltos en bruto / serializados / IHttpActionResult puede ser muy confuso desde la perspectiva del desarrollador, especialmente si no está trabajando solo y necesita traer a otros desarrolladores a la velocidad con ese enfoque híbrido.

La mejor técnica que he utilizado para minimizar ese problema en las aplicaciones web ASP.NET que no son Core es importar (y configurar correctamente) el paquete de la API web en la aplicación web basada en MVC, para que pueda tener lo mejor de ambos mundos: Controllers para Vistas, ApiControllers para datos.

Para hacer eso, debes hacer lo siguiente:

  • Instale los siguientes paquetes de API web usando NuGet: Microsoft.AspNet.WebApi.Core y Microsoft.AspNet.WebApi.WebHost .
  • Agregue uno o más ApiControllers a su carpeta /Controllers/ .
  • Agregue el siguiente archivo WebApiConfig.cs a su /App_Config/ carpeta:

 using System.Web.Http; public static class WebApiConfig { public static void Register(HttpConfiguration config) { // Web API routes config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); } } 

Finalmente, deberá registrar la clase anterior en su clase de Inicio (ya sea Startup.cs o Global.asax.cs , dependiendo de si está usando la plantilla de inicio de OWIN o no).

Startup.cs

  public void Configuration(IAppBuilder app) { // Register Web API routing support before anything else GlobalConfiguration.Configure(WebApiConfig.Register); // The rest of your file goes there // ... AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); ConfigureAuth(app); // ... } 

Global.asax.cs

 protected void Application_Start() { // Register Web API routing support before anything else GlobalConfiguration.Configure(WebApiConfig.Register); // The rest of your file goes there // ... AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); // ... } 

Este enfoque, junto con sus pros y contras, se explica con más detalle en la siguiente publicación .

Todos los métodos en Web API devolverán datos (JSON) sin serialización.

Sin embargo, para devolver Datos JSON en controladores MVC, estableceremos el tipo de Resultado de Acción devuelto a JsonResult y llamaremos al método Json en nuestro objeto para asegurarnos de que esté empaquetado en JSON.

Es bastante simple decidir entre los dos: si está escribiendo una aplicación web / internet / intranet basada en HTML, tal vez con la llamada AJAX ocasional que vuelve json aquí y allá, quédese con MVC / Controller. Si desea proporcionar una interfaz basada en datos / REST-ful a un sistema, vaya con WebAPI. Puede combinar ambos, por supuesto, tener un ApiController atender llamadas AJAX desde una página MVC. Básicamente, el controlador se usa para mvc y api-controller se usa para Rest-API, puede usar ambos en el mismo progtwig que su necesidad