2012-02-29 29 views
266

Ho giocato con ASP.NET MVC 4 beta e ora vedo due tipi di controller: ApiController e Controller.Differenza tra ApiController e Controller in ASP.NET MVC

Sono un po 'confuso in quali situazioni posso scegliere un controller particolare.

Per esempio: se voglio restituire una vista, devo usare ApiController o l'ordinario Controller? Sono consapevole che l'API Web WCF è ora integrata con MVC.

Poiché ora è possibile utilizzare entrambi i controller, è possibile che qualcuno indichi in quali situazioni eseguire il controller corrispondente.

+5

Importante: ASPNET Core ha "unito" ApiController' e 'Controller' quindi se si utilizza il .NET più recente non è più necessario preoccuparsi di ApiController - https://docs.microsoft.com/en -us/aspnet/core/tutorial/first-web-api –

+0

Felice di averlo fatto! Ho previsto questo lungo ritorno dal modo in cui http://prideparrot.com/blog/archive/2012/10/asp_net_mvc_vs_webapi – VJAI

risposta

273

Utilizzare Controller per rendere le viste normali. L'azione ApiController restituisce solo i dati che sono serializzati e inviati al client.

here is the link

Citazione:

Nota Se avete lavorato con ASP.NET MVC, allora si ha già familiarità con i controller. Funzionano allo stesso modo in Web API, ma i controller in Web API derivano dalla classe ApiController invece della classe Controller. La prima importante differenza che noterete è che le azioni sui controller API Web non restituiscono viste, restituiscono dati.

ApiControllers sono specializzati nella restituzione dei dati. Ad esempio, si occupano di serializzare in modo trasparente i dati nel formato richiesto dal cliente. Inoltre, seguono uno schema di routing diverso per impostazione predefinita (come in: mappatura degli URL alle azioni), fornendo per convenzione una API REST-ful.

Probabilmente si potrebbe fare qualsiasi cosa usando un Controller invece di un ApiController con qualche (?) Codifica manuale. Alla fine, entrambi i controller si basano sulla base di ASP.NET. Ma avere un'API REST-ful è un requisito così comune oggi che WebAPI è stato creato per semplificare l'implementazione di una tale API.

È abbastanza semplice decidere tra i due: se si sta scrivendo un'applicazione web/internet/intranet basata su HTML - magari con la chiamata occasionale AJAX che restituisce json qua e là - attenersi a MVC/Controller. Se si desidera fornire un'interfaccia basata su dati/REST-ad un sistema, andare con WebAPI. È possibile combinare entrambi, naturalmente, con un ApiController per soddisfare le chiamate AJAX da una pagina MVC.

Per dare un esempio reale del mondo: attualmente sto lavorando con un sistema ERP che fornisce un'API REST-ful alle sue entità. Per questa API, WebAPI sarebbe un buon candidato. Allo stesso tempo, il sistema ERP fornisce un'applicazione Web altamente autorizzata AJAX che è possibile utilizzare per creare query per l'API REST-ful. La stessa applicazione Web potrebbe essere implementata come applicazione MVC, utilizzando WebAPI per recuperare metadati, ecc.

+9

Nota: dato che i tuoi dati saranno inviati via cavo, come saranno formattati? Il modo in cui i dati restituiti da ApiController è formattato è determinato dalla negoziazione del contenuto e dal collegamento GlobalConfiguration.Configuration.Formatters ...: http://blogs.msdn.com/b/kiranchalla/archive/2012/02/25/content- negoziazione-in-asp-net-mvc4-web-api-beta-parte-1.aspx –

+1

È corretto dire che l'API Web è una piattaforma comune per sito Web, mobile, ecc.? e potremmo usare Class Library invece di Web API? –

+0

Grazie @ TimLovell-Smith per la tua nota, perché per me Andre non risponde alla domanda: come un Controller può anche restituire dati, non spiega perché ApiController esiste ed è utile. – JYL

140

Quale preferiresti scrivere e mantenere?

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

Così ben spiegato !! Grazie. – himanshupareek66

+2

È un buon punto, ma ApiController è più della semplice serializzazione JSON. Si occupa anche di esaminare la richiesta e restituire XML se questo è il tipo accettato. –

+3

Se si utilizza il nucleo asp.net, tutti sono derivati ​​dalla classe 'Controller'. –

16

mi piace il fatto che MVC6 di ASP.NET Nucleo fuse i due modelli in una sola, perché ho spesso bisogno di supportare sia mondi.Mentre è vero che puoi modificare qualsiasi MVC ActionResult standard per agire & come un ApiController, può essere molto difficile da mantenere e da testare: oltre a questo, avere Controller i metodi che restituiscono ActionResult mescolati con altri che restituiscono dati raw/serializzati/IHttpActionResult possono essere molto confusi dal punto di vista dello sviluppatore, specialmente se non si lavora da soli e occorre portare altri sviluppatori per accelerare con tale approccio ibrido.

La tecnica migliore che ho raggiunto finora per ridurre al minimo il problema nelle applicazioni Web ASP.NET non core è di importare (e configurare correttamente) il pacchetto dell'API Web nell'applicazione Web basata su MVC, così posso avere il meglio di entrambi i mondi: Controllers per Views, ApiControllers per i dati.

Per fare questo, è necessario effettuare le seguenti operazioni:

  • installare i seguenti pacchetti Web API utilizzando NuGet: Microsoft.AspNet.WebApi.Core e Microsoft.AspNet.WebApi.WebHost.
  • Aggiungi uno o più ApiController alla tua cartella /Controllers/.
  • Aggiungere i seguenti WebApiConfig.cs file nella cartella /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 } 
     ); 
    } 
} 

Infine, è necessario registrare la classe di cui sopra per il vostro avvio classe (sia Startup.cs o Global.asax.cs, a seconda se si sta usando OWIN Startup template 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); 
    // ... 
} 

Questo approccio - insieme con i suoi vantaggi e svantaggi - è ulteriormente spiegato in the following post.

1

Ogni metodo in Web API restituirà dati (JSON) senza serializzazione.

Tuttavia, per restituire JSON Data nei controller MVC, imposteremo il tipo di Risultato azione restituito su JsonResult e richiameremo il metodo Json sul nostro oggetto per garantire che sia impacchettato in JSON.

Problemi correlati