web-dev-qa-db-fra.com

Différence entre ApiController et le contrôleur dans ASP.NET MVC

J'ai joué avec ASP.NET MVC 4 bêta et je vois maintenant deux types de contrôleurs: ApiController et Controller

Je suis un peu confus dans quelles situations je peux choisir un contrôleur particulier. 

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

Depuis, nous pouvons utiliser les deux contrôleurs. Quelqu'un peut-il indiquer quelle situation choisir pour le contrôleur correspondant?.

295
VJAI

Utilisez Controller pour rendre vos vues normales. L'action ApiController renvoie uniquement les données 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 la même manière dans les API Web, mais les contrôleurs de ces API 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 sur les contrôleurs API Web ne renvoient pas de vues, elles renvoient des données.

ApiControllers sont spécialisés dans la restitution de données. Par exemple, ils s’occupent de la sérialisation transparente des données dans le format demandé par le client. En outre, ils suivent un schéma de routage différent par défaut (comme dans: mappage des URL en actions), fournissant une API REST-ful par convention. 

Vous pourriez probablement faire n'importe quoi en utilisant un contrôleur au lieu d'un ApiController avec le codage manuel some (?). En fin de compte, les deux contrôleurs s'appuient sur la fondation ASP.NET. Mais avoir une API REST-ful est une exigence si 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 le HTML - peut-être avec l’appel occasionnel AJAX renvoyant json ici et là - restez-en à MVC/Controller. Si vous souhaitez fournir une interface axée sur les données/REST-ful à un système, utilisez WebAPI. Bien entendu, vous pouvez combiner les deux en faisant appel à ApiController pour répondre aux 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. WebAPI serait un bon candidat pour cette API. En même temps, le système ERP fournit une application Web hautement AJAX 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, en utilisant WebAPI pour extraire des métadonnées, etc.

308
Andre Loker

Que préféreriez-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();
  }
}
167
Manish Jain

J'aime le fait que le MVC6 d'ASP.NET Core ait fusionné les deux modèles en un seul parce que j'ai souvent besoin de prendre en charge les deux mondes. Il est vrai que vous pouvez modifier n'importe quelle variable MVC Controller (et/ou développer vos propres classes ActionResult) pour agir et se comporter comme une ApiController, mais il peut être très difficile de maintenir et de tester: Contrôleurs Les méthodes renvoyant ActionResult mélangées à d'autres renvoyant des données brutes/sérialisées/IHttpActionResult peuvent être très déroutantes du point de vue des développeurs, en particulier si vous ne travaillez pas seul et devez amener d'autres développeurs à utiliser cette approche hybride plus rapidement.

La meilleure technique pour minimiser ce problème dans les applications Web non basées sur ASP.NET consiste à importer (et à configurer correctement) le package d'API Web dans l'application Web basée sur MVC, de manière à pouvoir tirer le meilleur parti des deux. mondes: Controllers pour les vues, ApiControllers pour les données.

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

  • Installez les packages d’API Web suivants à l’aide de NuGet: Microsoft.AspNet.WebApi.Core et Microsoft.AspNet.WebApi.WebHost.
  • Ajoutez un ou plusieurs ApiControllers à votre dossier /Controllers/.
  • Ajoutez le fichier WebApiConfig.cs suivant à votre dossier /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 }
        );
    }
}

Enfin, vous devez inscrire la classe ci-dessus dans votre classe Startup (soit Startup.cs ou Global.asax.cs, selon que vous utilisez ou non le modèle de démarrage OWIN).

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 inconvénients - est expliquée plus en détail dans ce post j’ai écrit sur mon blog.

23
Darkseal

Chaque méthode de l'API Web renvoie des données (JSON) sans sérialisation.

Toutefois, afin de renvoyer les données JSON dans les contrôleurs MVC, nous allons définir le type Action Result renvoyé sur JsonResult et appeler la méthode Json sur notre objet pour garantir son emballage en JSON.

1
Shailesh Uke

C'est presque un, mais c'est différent Le nom, le but d'utilisation et la transparence entre MVC et l'API.

0
user11592203

La principale différence est que: l'API Web est un service destiné à tous les clients et périphériques, et MVC Controller ne sert que son client. La même chose parce que c'est la plateforme MVC.

0
Anjyr

Il est assez simple de choisir entre les deux: si vous écrivez une application Web/Internet/Intranet basée sur le HTML - peut-être avec un appel occasionnel AJAX renvoyant json ici et là - restez-en à MVC/Controller. Si vous souhaitez fournir une interface axée sur les données/REST-ful à un système, utilisez WebAPI. Bien entendu, vous pouvez combiner les deux, en ayant un ApiController qui répond à AJAX appels depuis une page MVC . Fondamentalement, contrôleur est utilisé pour mvc et api-controller est utilisé pour Rest - API, vous pouvez utiliser les deux dans le même programme selon vos besoins.

0
user9521236