391 votes

Différence entre ApiController et Controller dans ASP.NET MVC

Je me suis amusé avec ASP.NET MVC 4 beta et je vois maintenant deux types de contrôleurs : ApiController y Controller .

Je ne comprends pas très bien dans quelles situations je peux choisir un contrôleur particulier.

Par exemple : si je veux retourner une vue, je dois utiliser ApiController ou l'ordinaire Controller ? Je suis conscient que l'API Web WCF est désormais intégrée à MVC.

Puisque maintenant nous pouvons utiliser les deux contrôleurs, quelqu'un peut-il indiquer dans quelles situations il faut choisir le contrôleur correspondant ?

31 votes

Important : ASPNET Core a 'fusionné'. ApiController y Controller donc si vous utilisez la nouvelle version de .NET, vous n'avez plus besoin de vous soucier d'ApiController. learn.microsoft.com/fr/aspnet/core/tutorials/first-web-api

4 votes

Je suis content qu'ils l'aient fait ! Je l'avais prédit depuis longtemps d'ailleurs prideparrot.com/blog/archive/2012/10/asp_net_mvc_vs_webapi

2 votes

" Mark et Ted sont de grands amis. Ils remplissent généralement leur table à dîner de discussions intéressantes surtout techniques ! " Personne ne s'attend à une bande dessinée très technique. ;^)

393voto

Andre Loker Points 4336

Utilisez le contrôleur pour rendre vos vues normales. L'action ApiController ne renvoie que les données qui sont sérialisées et envoyées au client.

Voici le lien

Citation :

Remarque Si vous avez travaillé avec ASP.NET MVC, vous connaissez déjà les contrôleurs. Ils fonctionnent de manière similaire dans l'API Web, mais les contrôleurs de l'API Web dérivent de la classe ApiController au lieu de la classe Controller. La première différence majeure que vous remarquerez est que les actions des contrôleurs de l'API Web ne renvoient pas de vues, mais des données.

Les ApiControllers sont spécialisés dans le renvoi de données. Par exemple, ils se chargent de sérialiser de manière transparente les données dans le format demandé par le client. De plus, ils suivent un schéma d'acheminement différent par défaut (comme dans le cas de la correspondance entre les URL et les actions), fournissant une API REST par convention.

Vous pourriez probablement faire n'importe quoi en utilisant un contrôleur au lieu d'un ApiController avec un peu ( ?) de codage manuel. En fin de compte, les deux contrôleurs reposent sur la fondation ASP.NET. Mais disposer d'une API REST est une exigence tellement courante aujourd'hui que WebAPI a été créé pour simplifier la mise en œuvre d'une telle API.

Il est assez simple de choisir entre les deux : si vous écrivez une application web/internet/intranet basée sur HTML - avec peut-être un appel AJAX occasionnel renvoyant du json ici et là - restez sur MVC/Controller. Si vous souhaitez fournir une interface orientée données/REST à un système, optez pour WebAPI. Vous pouvez combiner les deux, bien sûr, en ayant un ApiController qui traite les appels AJAX à partir d'une page MVC.

Pour donner un exemple concret : Je travaille actuellement avec un système ERP qui fournit une API REST-ful à ses entités. Pour cette API, WebAPI serait un bon candidat. En même temps, le système ERP fournit une application web hautement AJAX-ifiée que vous pouvez utiliser pour créer des requêtes pour l'API REST-ful. L'application web elle-même pourrait être implémentée en tant qu'application MVC, utilisant la WebAPI pour récupérer les méta-données, etc.

10 votes

Remarque : comme vos données seront envoyées par câble, comment seront-elles formatées ? La façon dont les données renvoyées par un ApiController sont formatées est déterminée par la négociation du contenu et le lien GlobalConfiguration.Configuration.Formatters... : blogs.msdn.com/b/kiranchalla/archive/2012/02/25/

1 votes

Est-il correct de dire que l'API Web est une plateforme commune pour les sites web, les mobiles, etc. et que nous pourrions utiliser une bibliothèque de classe au lieu de l'API Web ?

0 votes

Merci @TimLovell-Smith pour votre remarque, car pour moi André ne répond pas à la question : comme un contrôleur peut aussi renvoyer des données, cela n'explique pas pourquoi ApiController existe et est utile.

206voto

Manish Jain Points 1505

Lequel préférez-vous écrire et maintenir ?

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<Tweet> Get() {
    return Twitter.GetTweets();
  }
}

8 votes

C'est un bon point mais ApiController est plus qu'une simple sérialisation JSON. Il se charge également d'examiner la requête et de renvoyer du XML si c'est le type accepté.

13 votes

Si vous utilisez asp.net core, tous ces éléments sont dérivés de Controller classe.

4 votes

Cela semble être de vieux exemples, maintenant nous n'avons plus besoin de nous inquiéter. ApiController juste : Controller fonctionne, pouvez-vous ajouter un nouvel exemple de contrôleur dot net core aussi

33voto

Darkseal Points 18

J'apprécie le fait que MVC6 d'ASP.NET Core ait fusionné les deux modèles en un seul, car j'ai souvent besoin de prendre en charge les deux mondes. S'il est vrai que vous pouvez modifier n'importe quel modèle MVC standard Controller (et/ou développez votre propre ActionResult ) pour agir et se comporter exactement comme une ApiController il peut être très difficile de le maintenir et de le tester. Contrôleurs les méthodes retournant ActionResult mélangé avec d'autres retournant des données brutes/sérialisées/ IHttpActionResult Les données peuvent être très déroutantes du point de vue du développeur, surtout si vous ne travaillez pas seul et que vous devez amener d'autres développeurs à adopter cette approche hybride.

La meilleure technique que j'ai trouvée jusqu'à présent pour minimiser ce problème dans les applications Web ASP.NET non-Core est d'importer (et de configurer correctement) le paquet API Web dans l'application Web basée sur MVC, afin de pouvoir bénéficier du meilleur des deux mondes : Controllers pour les vues, ApiControllers pour les données.

Pour ce faire, vous devez procéder comme suit :

  • Installez les paquets API Web suivants à l'aide de NuGet : Microsoft.AspNet.WebApi.Core y Microsoft.AspNet.WebApi.WebHost .
  • Ajoutez un ou plusieurs ApiControllers à vos /Controllers/ carpeta.
  • Ajoutez ce qui suit WebApiConfig.cs à votre /App_Config/ dossier :

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

Enfin, vous devrez enregistrer la classe ci-dessus dans votre système de gestion de l'information. Démarrage (soit Startup.cs o Global.asax.cs (selon que vous utilisez ou non le modèle OWIN Startup).

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

Cette approche - ainsi que ses avantages et ses inconvénients - est expliquée plus en détail dans le document suivant ce poste J'ai écrit sur mon blog.

9voto

Imran Points 76

Réponse rapide et brève

Si vous voulez renvoyer une vue, vous devez être en "Contrôleur" .

Contrôleur normal - ASP.NET MVC : vous avez affaire à un "contrôleur" normal si vous êtes dans une application Web ASP.net. Vous pouvez créer des actions de contrôleur et vous pouvez renvoyer Views().

ApiController Contrôleur : Vous créez des ApiControllers lorsque vous développez des API REST ASP.net. Vous ne pouvez pas renvoyer de vues (bien que vous puissiez renvoyer Json/Data pour le HTML sous forme de chaîne). Ces API sont considérées comme des backend et leurs fonctions sont appelées pour retourner des données et non la vue.

Plus de détails ici

6voto

Pinch Points 1107

Utilisez le contrôleur, et non l'ApiController.

Quant aux différences : Cliquez ici pour voir

Un beau synopsis :

  • Négociation du contenu
  • Flexibilité
  • Séparation des préoccupations

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X