Comment ajouter une API Web à un projet d'application Web ASP.NET MVC 4 existant?

365

Je souhaite ajouter une API Web ASP.NET à un projet d'application Web ASP.NET MVC 4, développé dans Visual Studio 2012. Quelles étapes dois-je effectuer pour ajouter une API Web fonctionnelle au projet? Je suis conscient que j'ai besoin d'un contrôleur dérivé d'ApiController, mais c'est à peu près tout ce que je sais.

Faites-moi savoir si j'ai besoin de fournir plus de détails.

aknuds1
la source

Réponses:

455

Les étapes que je devais effectuer étaient:

  1. Ajoutez une référence à System.Web.Http.WebHost.
  2. Ajouter App_Start\WebApiConfig.cs(voir l'extrait de code ci-dessous).
  3. Importez l'espace System.Web.Httpde noms dans Global.asax.cs.
  4. Appel WebApiConfig.Register(GlobalConfiguration.Configuration)à MvcApplication.Application_Start()(dans le fichier Global.asax.cs), avant l' enregistrement de la voie d'application Web par défaut comme qui autrement prioritaire.
  5. Ajoutez un contrôleur dérivant de System.Web.Http.ApiController.

Je pourrais ensuite en apprendre suffisamment du tutoriel (Votre première API Web ASP.NET) pour définir mon contrôleur d'API.

App_Start \ WebApiConfig.cs:

using System.Web.Http;

class WebApiConfig
{
    public static void Register(HttpConfiguration configuration)
    {
        configuration.Routes.MapHttpRoute("API Default", "api/{controller}/{id}",
            new { id = RouteParameter.Optional });
    }
}

Global.asax.cs:

using System.Web.Http;

...

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    RegisterGlobalFilters(GlobalFilters.Filters);
    WebApiConfig.Register(GlobalConfiguration.Configuration);
    RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
}

Mise à jour 10.16.2015:

Word l'a, le package NuGet Microsoft.AspNet.WebApi doit être installé pour que ce qui précède fonctionne.

aknuds1
la source
12
C'était vraiment utile. Je devais également ajouter une référence System.Net.Http, mais à part cela, cela a fonctionné comme un charme!
Christofer Eliasson
5
J'ai également mis à niveau un projet de MVC3 vers 4 et j'ai également dû ajouter une référence à System.Web.Http.
Damien Sawyer
3
Vous pouvez utiliser nuget maintenant et rester au courant de tous les changements qui se produisent! nuget.org/packages/Microsoft.AspNet.WebApi
Chris
3
Je n'arriverais pas à ce que cela fonctionne jusqu'à ce que j'ai changé mon registre d'API Web en: GlobalConfiguration.Configure (WebApiConfig.Register);
KingOfHypocrites
3
@LuisGouveia Je suppose que c'est trop tard mais quelqu'un d'autre le résoudra probablement plus rapidement si c'est ce que j'avais. GlobalConfiguration.Configure (WebApiConfig.Register); dans Global.asax précède RouteConfig.RegisterRoutes (RouteTable.Routes);
Maxim
77

MISE À JOUR 11/22/2013 - c'est le dernier package WebApi:

Install-Package Microsoft.AspNet.WebApi

Réponse originale (il s'agit d'un ancien package WebApi)

Install-Package AspNetWebApi

Plus de détails .

cdeutsch
la source
3
Depuis 2013, il s'agit d'un package hérité et vous le souhaitez Install-Package Microsoft.AspNet.WebApimaintenant. Voir nuget.org/packages/Microsoft.AspNet.WebApi
Chris
70

Pour ajouter WebAPI dans mon projet MVC 5.

  1. Ouvrez la console du gestionnaire de packages NuGet et exécutez

    PM> Install-Package Microsoft.AspNet.WebApi
  2. Ajouter des références à System.Web.Routing, System.Web.Netet System.Net.Httpdll sinon déjà là

  3. Cliquez avec le bouton droit sur le dossier des contrôleurs> ajouter un nouvel élément> Web> Ajouter un contrôleur d'API Web

  4. Web.config sera modifié en conséquence par VS

  5. Ajouter une Application_Startméthode si ce n'est déjà fait

    protected void Application_Start()
    {
        //this should be line #1 in this method
        GlobalConfiguration.Configure(WebApiConfig.Register);
    }
    
  6. Ajoutez la classe suivante (j'ai ajouté dans le fichier global.asax.cs)

    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 }
             );
         }
     }
    
  7. Modifiez la méthode de l'API Web en conséquence

    namespace <Your.NameSpace.Here>
    {
        public class VSController : ApiController
        {
            // GET api/<controller>   : url to use => api/vs
            public string Get()
            {
                return "Hi from web api controller";
            }
    
            // GET api/<controller>/5   : url to use => api/vs/5
            public string Get(int id)
            {
                return (id + 1).ToString();
            }
        }
    }
    
  8. Reconstruire et tester

  9. Créez une page HTML simple

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title></title>    
        <script src="../<path_to_jquery>/jquery-1.9.1.min.js"></script>
        <script type="text/javascript">
            var uri = '/api/vs';
            $(document).ready(function () {
                $.getJSON(uri)
                .done(function (data) {
                    alert('got: ' + data);
                });
    
                $.ajax({
                    url: '/api/vs/5',
                    async: true,
                    success: function (data) {
                        alert('seccess1');
                        var res = parseInt(data);
                        alert('got res=' + res);
                    }
                });
            });
        </script>
    </head>
    <body>
    ....
    </body>
    </html>
    
kheya
la source
Le point qui a créé une différence était de placer le WebApiconfig.Register sur la première ligne, comme l'a mentionné @kheya
Rajat
Je voudrais ajouter que le nom de votre contrôleur api doit se terminer par Controller , comme CarController (pas seulement Car ) !!! Beaucoup de gens l'oublient et obtiennent le message d'erreur "Aucun type correspondant au contrôleur nommé {0}" n'a été trouvé
1_bug
Pour être plus efficace avec cette belle réponse, vous pouvez ignorer les étapes 4, 8 et 9. (elles ne sont pas si essentielles) Et si vous échangez l'ordre des étapes 5 et 6, elles auront plus de sens (il vaut mieux créer une classe alors utilisez-le, au lieu d'utiliser la classe puis créez-le)
Hakan Fıstık
Où ajoutons-nous exactement les références à System.Web.Routing, System.Web.Net et System.Net.Http?
gabed123
28

Dès que vous ajoutez un "WebApi Controller" sous le dossier controllers, Visual Studio s'occupe automatiquement des dépendances;

Visual Studio a ajouté l'ensemble complet des dépendances pour l'API Web ASP.NET 2 pour projeter «MyTestProject».

Le fichier Global.asax.cs du projet peut nécessiter des modifications supplémentaires pour activer l'API Web ASP.NET.

  1. Ajoutez les références d'espace de noms suivantes:

    using System.Web.Http; using System.Web.Routing;

  2. Si le code ne définit pas déjà une méthode Application_Start, ajoutez la méthode suivante:

    void protégé Application_Start () {}

  3. Ajoutez les lignes suivantes au début de la méthode Application_Start:

    GlobalConfiguration.Configure (WebApiConfig.Register);

Teoman shipahi
la source
C'est de loin le moyen le plus simple d'y parvenir maintenant.
Adam Smith
1
Ne fonctionne pas ici. 1. Nuget: Install-Package Microsoft.AspNet.WebApi2. Ajoutez un nouvel élément "Classe de contrôleur API Web (v2.1)". Résultat: ajoute le contrôleur api mais ne change pas Application_Start. Avec Owin.
Artyom
2
c'est la bonne réponse lorsque vous avez vs2015 - mise à jour 3 et ajout du contrôleur web api 2.
ModChowdhury
Il l'a fait en 2017, mais j'ai dû mettre à niveau mes assemblages WebApi. J'ai également dû créer la classe WebApiConfig manuellement, docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/…
johnny
22

Vous pouvez installer à partir de nuget comme l'image ci-dessous:

entrez la description de l'image ici

Ou, exécutez la ligne de commande ci-dessous sur la console du gestionnaire de packages:

Install-Package Microsoft.AspNet.WebApi
cuongle
la source
3
Alors, que dois-je faire d'autre que d'ajouter le contrôleur? C'est pourquoi j'ai d'abord posé cette question, le tutoriel ne dit pas vraiment car il suppose un projet d'API Web. J'ai ajouté un contrôleur API, mais il n'est pas acheminé vers.
aknuds1
1
Le tutoriel n'a pas été très utile en ce qui concerne l'ajout d'une API Web à un projet existant, donc je l'ai compris à partir d'un projet d'API Web, comme indiqué dans ma réponse.
aknuds1
Je suis d'accord, il semble que cette plomberie soit déjà installée si vous utilisez le modèle de projet Web App.
longda
@cuongle: la version 2.2 de l'API Web sera installée avec MVC 4? prend-il en charge MVC 4?
Thomas
20

Avant de commencer à fusionner des projets MVC et API Web, je suggère de lire les inconvénients et les avantages pour les séparer en tant que projets différents. Une chose très importante (la mienne) est les systèmes d'authentification, qui sont totalement différents.

SI vous devez utiliser des requêtes authentifiées sur MVC et API Web, vous devez vous rappeler que l'API Web est RESTful (pas besoin de garder la session, les requêtes HTTP simples, etc.), mais MVC ne l'est pas.

Pour regarder les différences d'implémentations, créez simplement 2 projets différents dans Visual Studio 2013 à partir de modèles: un pour MVC et un pour API Web (n'oubliez pas d'activer "Authentification individuelle" lors de la création). Vous verrez beaucoup de différence dans AuthencationControllers.

Alors, soyez conscient.

Yarkov Anton
la source
11

REMARQUE: ce n'est qu'une abréviation de cette réponse ci-dessus

  1. Ouvrez la console du gestionnaire de packages NuGet et exécutez

    PM> Install-Package Microsoft.AspNet.WebApi
  2. Ajouter des références à System.Web.Routing, System.Web.Netet System.Net.Httpdll sinon déjà là

  3. Ajoutez la classe suivante

    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 }
             );
         }
     }
    
  4. Ajouter une Application_Startméthode si elle n'y est pas déjà (dans le fichier global.asax.cs)

    protected void Application_Start()
    {
        //this should be line #1 in this method
        GlobalConfiguration.Configure(WebApiConfig.Register);
    }
    
  5. Cliquez avec le bouton droit sur le dossier des contrôleurs> ajouter un nouvel élément> Web> Ajouter un contrôleur d'API Web

    namespace <Your.NameSpace.Here>
    {
        public class VSController : ApiController
        {
            // GET api/<controller>   : url to use => api/vs
            public string Get()
            {
                return "Hi from web api controller";
            }  
        }
    }
    
Hakan Fıstık
la source
Où ajoutons-nous exactement les références à System.Web.Routing, System.Web.Net et System.Net.Http?
gabed123
1
Dans la boîte de dialogue Ajouter une référence, ouvrez cette boîte de dialogue et recherchez les noms de ces assemblys, il y a de grandes chances qu'ils soient déjà ajoutés. (mais juste pour être sûr)
Hakan Fıstık
La méthode Application_Start est-elle censée faire partie de la classe globale dans Global.asax.cs?
gabed123
oui, j'ai mis à jour ma réponse pour démontrer que, pour la note
Hakan Fıstık
1
@HakamFostok Cela m'a aidé. Je vous remercie!
csichar
3

La solution ci-dessus fonctionne parfaitement. Je préfère choisir l'option API Web tout en sélectionnant le modèle de projet comme indiqué dans l'image ci-dessous

Remarque: La solution fonctionne avec Visual Studio 2013 ou supérieur. La question d'origine a été posée en 2012 et c'est 2016, donc ajout d'une solution Visual Studio 2013 ou supérieure.

Modèle de projet montrant l'option API Web

Sankar Krishnamoorthy
la source
2
Si vous créez un projet qui implique l'API Web, il serait plus facile de choisir l'option API Web. L'option créera tous les fichiers requis comme mentionné dans les réponses ci-dessus.
Sankar Krishnamoorthy du
Le problème est ici dans Visual studio 2012 et mvc 4. Bien que votre solution soit très bien, vous ne pouvez pas le faire de cette façon dans VS 2012
netfed
C'est un bon point et j'ai essayé la solution ci-dessus avec VS 2013. Merci @netfed de l'avoir souligné.
Sankar Krishnamoorthy
Salut à tous, J'ai l'élément API qui fonctionne dans ma solution MVC, mais par défaut, il a essayé d'exécuter la solution en tant que solution API. Mais je veux qu'il fonctionne comme une solution MVC par défaut, puis si vous allez à l'emplacement de l'API, etc., exécutez les API. Est-ce que quelqu'un d'autre a eu ce problème et a pu le résoudre? Merci
Chris Cooper
1

J'ai eu le même problème, la solution était si simple

Faites un clic droit sur l'installation de solotion Microsoft.ASP.NET.WebApi à partir de "Gérer le package Nuget pour Sulotion"

boom c'est tout;)

iDeveloper
la source