Diferença entre o ApiController e o Controller no ASP.NET MVC

Eu tenho jogado com a ASP.NET MVC 4 beta e vejo dois tipos de controladores agora: ApiController e Controller .

Estou um pouco confuso em quais situações eu posso escolher um determinado controlador.

Por ex: Se eu quiser retornar uma visão, então eu tenho que usar o ApiController ou o Controller comum? Estou ciente de que a API da Web do WCF agora está integrada ao MVC.

Desde agora podemos usar os dois controladores, alguém pode, por favor, apontar em quais situações ir para o controlador correspondente.

Use o Controlador para renderizar suas visualizações normais. A ação ApiController só retorna dados que são serializados e enviados para o cliente.

aqui está o link

Citar:

Nota Se você já trabalhou com a ASP.NET MVC, já está familiarizado com os controladores. Eles funcionam de forma semelhante na API da Web, mas os controladores na API da Web derivam da class ApiController em vez da class Controller. A primeira grande diferença que você notará é que as ações nos controladores de API da Web não retornam exibições, elas retornam dados.

ApiControllers são especializados em retornar dados. Por exemplo, eles cuidam da serialização transparente dos dados no formato solicitado pelo cliente. Além disso, eles seguem um esquema de roteamento diferente por padrão (como em URLs de mapeamento para ações), fornecendo uma API REST-full por convenção.

Você provavelmente poderia fazer qualquer coisa usando um controlador em vez de um ApiController com a codificação manual de alguns (?). No final, ambos os controladores são baseados na base do ASP.NET. Mas ter uma API REST-DUM é um requisito tão comum hoje em dia que o WebAPI foi criado para simplificar a implementação de uma API desse tipo.

É bastante simples decidir entre os dois: se você está escrevendo uma aplicação web / internet / intranet baseada em HTML – talvez com a ocasional chamada AJAX retornando json aqui e ali – fique com MVC / Controller. Se você quiser fornecer uma interface baseada em dados / REST-ful para um sistema, vá com o WebAPI. Você pode combinar ambos, claro, ter um ApiController atendendo chamadas AJAX de uma página MVC.

Para dar um exemplo do mundo real: Atualmente, estou trabalhando com um sistema ERP que fornece uma API REST-full para suas entidades. Para esta API, o WebAPI seria um bom candidato. Ao mesmo tempo, o sistema ERP fornece um aplicativo da web altamente AJAX que você pode usar para criar consultas para a API REST-ful. O aplicativo da web em si poderia ser implementado como um aplicativo MVC, fazendo uso do WebAPI para buscar metadados, etc.

Qual você prefere escrever e manter?

ASP.NET MVC

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

API da Web do ASP.NET

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

Eu adoro o fato de que o MVC6 do ASP.NET Core mesclou os dois padrões em um porque eu geralmente preciso suportar os dois mundos. Embora seja verdade que você pode ajustar qualquer Controller MVC padrão (e / ou desenvolver suas próprias classs ActionResult ) para agir e se comportar como um ApiController , pode ser muito difícil manter e testar: além disso, ter methods de Controladores retornando ActionResult misturado com outros que retornam dados raw / serialized / IHttpActionResult pode ser muito confuso do ponto de vista do desenvolvedor, especialmente se você não estiver trabalhando sozinho e precisar trazer outros desenvolvedores para acelerar essa abordagem híbrida.

A melhor técnica que venho até agora para minimizar esse problema em aplicativos da Web não essenciais do ASP.NET é importar (e configurar adequadamente) o pacote da API da Web no aplicativo da Web baseado em MVC, para que eu possa ter o melhor de ambos mundos: Controllers for Views, ApiControllers para dados.

Para fazer isso, você precisa fazer o seguinte:

  • Instale os seguintes pacotes da API da Web usando o NuGet: Microsoft.AspNet.WebApi.Core e Microsoft.AspNet.WebApi.WebHost .
  • Adicione um ou mais ApiControllers à sua pasta /Controllers/ .
  • Adicione o seguinte arquivo WebApiConfig.cs à sua pasta /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 } ); } } 

Finalmente, você precisará registrar a class acima em sua class Startup ( Startup.cs ou Global.asax.cs , dependendo se você estiver usando o modelo OWIN Startup ou não).

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

Esta abordagem – juntamente com os seus prós e contras – é explicada no seguinte post .

Todo método na API da Web retornará dados (JSON) sem serialização.

No entanto, para retornar dados JSON em controladores MVC, definiremos o tipo de Resultado da Ação retornado como JsonResult e chamaremos o método Json em nosso object para garantir que ele seja empacotado em JSON.

É bastante simples decidir entre os dois: se você está escrevendo uma aplicação web / internet / intranet baseada em HTML – talvez com a ocasional chamada AJAX retornando json aqui e ali – fique com MVC / Controller. Se você quiser fornecer uma interface baseada em dados / REST-ful para um sistema, vá com o WebAPI. Você pode combinar ambos, claro, ter um ApiController atendendo chamadas AJAX de uma página MVC. Basicamente controlador é usado para mvc e api-controller é usado para Rest-API você pode usar ambos no mesmo programa que você precisa