2012-02-29 32 views
266

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

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

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

Desde ahora podemos usar ambos controladores. Alguien puede indicar en qué situaciones ir para el controlador correspondiente.

+5

Importante: ASPNET Core ha "fusionado" 'ApiController' y' Controller', por lo que si está usando el .NET más nuevo ya no tiene que preocuparse por ApiController - https://docs.microsoft.com/es -us/aspnet/core/tutorials/first-web-api –

+0

¡Contento que lo hicieron! Lo predije hace mucho tiempo por cierto http://prideparrot.com/blog/archive/2012/10/asp_net_mvc_vs_webapi – VJAI

Respuesta

273

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

here is the link

Cita:

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 pueda hacer cualquier cosa con un controlador en lugar de un ApiController con la codificación 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, quizás 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.

+9

Nota: dado que sus datos serán enviados a través del cable, ¿cómo se formateará? La forma en que los datos que devuelve un ApiController está formateada está determinada por la negociación de contenido y GlobalConfiguration.Configuration.Formatters ... enlace: http://blogs.msdn.com/b/kiranchalla/archive/2012/02/25/content- negotiation-in-asp-net-mvc4-web-api-beta-part-1.aspx –

+1

¿Es correcto decir que la API web es una plataforma común para sitios web, dispositivos móviles, etc.? y podríamos usar Class Library en lugar de Web API? –

+0

Gracias a TimLovell-Smith por su nota, porque para mí, Andre no responde la pregunta: como controlador también puede devolver datos, no explica por qué ApiController existe y es útil. – JYL

140

¿Qué prefieres escribir y mantener?

ASP.NET MVC

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

ASP.NET Web API

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

Muy bien explicado !! Gracias. – himanshupareek66

+2

Es un buen punto, pero ApiController es mucho más que la serialización JSON. También se encarga de mirar la solicitud y devolver XML si ese es el tipo de aceptación. –

+3

Si usa asp.net core, todos ellos se derivan de la clase 'Controller'. –

16

Me encanta el hecho de que MVC6 de ASP.NET Core fusionó los dos patrones en uno porque a menudo la necesidad de apoyar tanto mundos.Si bien es cierto que se puede ajustar cualquier MVC estándar Controller (y/o desarrollar sus propios ActionResult clases) para actuar & se comportan igual que un ApiController, que puede ser muy difícil de mantener y hacer la prueba: por encima de eso, teniendo controladores Los métodos que devuelven ActionResult combinados con otros datos devueltos en bruto/serializados/IHttpActionResult pueden ser muy confusos 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 hasta ahora para minimizar ese problema en las aplicaciones web ASP.NET que no son Core es importar (y configurar correctamente) el paquete de API web en la aplicación web MVC, para que pueda tener lo mejor de ambos mundos: Controllers para Views, ApiControllers para datos.

Con el fin de hacer eso, es necesario hacer lo siguiente:

  • instalar los siguientes paquetes de API Web utilizando NuGet: Microsoft.AspNet.WebApi.Core y Microsoft.AspNet.WebApi.WebHost.
  • Agregue uno o más ApiControllers a su carpeta /Controllers/.
  • Añadir los siguientes WebApiConfig.cs archivo a la carpeta /App_Config/:

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 } 
     ); 
    } 
} 

Por último, tendrá que registrar la clase anterior a su inicio de la clase (ya sea o Startup.csGlobal.asax.cs, dependiendo 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 en the following post.

1

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 en JsonResult y llamaremos al método Json en nuestro objeto para asegurarnos de que está empaquetado en JSON.

Cuestiones relacionadas