Come aggiungere l'API Web a un progetto di applicazione Web ASP.NET MVC 4 esistente?


365

Vorrei aggiungere un un'API Web ASP.NET a un progetto di applicazione Web ASP.NET MVC 4, sviluppato in Visual Studio 2012. Quali passaggi devo eseguire per aggiungere un'API Web funzionante al progetto? Sono consapevole che ho bisogno di un controller derivante da ApiController, ma questo è tutto ciò che so.

Fammi sapere se devo fornire maggiori dettagli.

Risposte:


455

I passaggi che dovevo eseguire erano:

  1. Aggiungi riferimento a System.Web.Http.WebHost.
  2. Inserisci App_Start\WebApiConfig.cs (vedi snippet di codice di seguito).
  3. Importa lo spazio dei nomi System.Web.Httpin Global.asax.cs.
  4. Chiamata WebApiConfig.Register(GlobalConfiguration.Configuration)a MvcApplication.Application_Start()(in un file Global.asax.cs), prima di registrare il percorso di applicazione Web di default come che altrimenti la precedenza.
  5. Aggiungi un controller derivante da System.Web.Http.ApiController.

Potrei quindi imparare abbastanza dal tutorial (Your First ASP.NET Web API) per definire il mio controller 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);
}

Aggiornamento 10.16.2015:

Word ha, il pacchetto NuGet Microsoft.AspNet.WebApi deve essere installato affinché funzioni sopra.


12
Questo è stato davvero utile. Ho dovuto aggiungere anche un riferimento System.Net.Http, ma a parte questo, ha funzionato come un fascino!
Christofer Eliasson,

5
Ho aggiornato anche un progetto da MVC3 a 4 e avevo anche bisogno di aggiungere un riferimento a System.Web.Http.
Damien Sawyer,

3
Puoi usare nuget ora e rimanere aggiornato su tutte le modifiche che si verificano! nuget.org/packages/Microsoft.AspNet.WebApi
Chris

3
Non riuscirò a farlo funzionare fino a quando non cambierei il mio registro API Web in: GlobalConfiguration.Configure (WebApiConfig.Register);
KingOf Hypocrites,

3
@LuisGouveia Immagino sia troppo tardi, ma qualcun altro probabilmente lo risolverà più velocemente se questo è quello che avevo. GlobalConfiguration.Configure (WebApiConfig.Register); in Global.asax precede RouteConfig.RegisterRoutes (RouteTable.Routes);
Massima

77

AGGIORNAMENTO 22/11/2013: questo è l'ultimo pacchetto WebApi:

Install-Package Microsoft.AspNet.WebApi

Risposta originale (si tratta di un pacchetto WebApi precedente)

Install-Package AspNetWebApi

Maggiori dettagli .


3
A partire dal 2013 questo è un pacchetto legacy e lo desideri Install-Package Microsoft.AspNet.WebApiora. Vedi nuget.org/packages/Microsoft.AspNet.WebApi
Chris

70

Per aggiungere WebAPI nel mio progetto MVC 5.

  1. Apri la console di gestione dei pacchetti NuGet ed esegui

    PM> Install-Package Microsoft.AspNet.WebApi
  2. Aggiungere riferimenti a System.Web.Routing, System.Web.Nete System.Net.HttpDLL se non è già presente

  3. Cartella dei controller fare clic con il pulsante destro del mouse> aggiungi nuovo elemento> web> Aggiungi controller API Web

  4. Web.config verrà modificato di conseguenza da VS

  5. Aggiungi Application_Startmetodo se non già presente

    protected void Application_Start()
    {
        //this should be line #1 in this method
        GlobalConfiguration.Configure(WebApiConfig.Register);
    }
  6. Aggiungi la seguente classe (ho aggiunto nel file 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. Modificare il metodo API web di conseguenza

    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. Ricostruisci e testa

  9. Crea una semplice pagina HTML

    <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>

Il punto che ha creato la differenza è stato collocare WebApiconfig.Register nella prima riga, come è stato menzionato da @kheya
Rajat il

Vorrei aggiungere, il nome del tuo controller API deve terminare con Controller , come CarController (non solo Car ) !!! Tante persone se ne dimenticano e ottengono il messaggio di errore "Nessun tipo trovato che corrisponde al controller chiamato {0} '"
1_bug

Per essere più efficiente con questa bella risposta, puoi ignorare i passaggi 4, 8 e 9. (non sono così essenziali) E se cambi l'ordine dei passaggi 5 e 6 avranno più senso (è meglio creare una classe quindi
usalo

Dove stiamo esattamente aggiungendo riferimenti a System.Web.Routing, System.Web.Net e System.Net.Http?
gabed123

28

Non appena si aggiunge un "Controller WebApi" nella cartella dei controller, Visual Studio si occupa automaticamente delle dipendenze;

Visual Studio ha aggiunto il set completo di dipendenze per l'API Web ASP.NET 2 al progetto "MyTestProject".

Il file Global.asax.cs nel progetto potrebbe richiedere ulteriori modifiche per abilitare l'API Web ASP.NET.

  1. Aggiungi i seguenti riferimenti allo spazio dei nomi:

    utilizzando System.Web.Http; utilizzando System.Web.Routing;

  2. Se il codice non definisce già un metodo Application_Start, aggiungere il seguente metodo:

    protetto void Application_Start () {}

  3. Aggiungi le seguenti righe all'inizio del metodo Application_Start:

    GlobalConfiguration.Configure (WebApiConfig.Register);


Questo è di gran lunga il modo più semplice per raggiungere questo obiettivo ora.
Adam Smith,

1
Non funziona qui. 1. Nuget: Install-Package Microsoft.AspNet.WebApi2. Aggiungi il nuovo elemento "Web Controller API Class (v2.1)". Risultato: aggiunge il controller api ma non cambia Application_Start. Con Owin.
Artyom,

2
questa è la risposta giusta quando hai vs2015 - aggiorna 3 e aggiungi controller web api 2.
ModChowdhury,

È stato nel 2017, ma ho dovuto aggiornare i miei assiemi WebApi. Ho anche dovuto creare manualmente la classe WebApiConfig
johnny il

22

È possibile installare da Nuget come l'immagine qui sotto:

inserisci qui la descrizione dell'immagine

Oppure, eseguire la riga di comando seguente sulla console di Package Manager:

Install-Package Microsoft.AspNet.WebApi

3
Quindi, cos'altro devo fare se non aggiungere il controller? Questo è il motivo per cui ho postato questa domanda in primo luogo, il tutorial non dice davvero poiché presuppone un progetto API Web. Ho aggiunto un controller API, ma non è indirizzato a.
Aknuds1

1
Il tutorial non è stato di grande aiuto per quanto riguarda l'aggiunta di un'API Web a un progetto esistente, quindi l'ho capito da un progetto API Web, come indicato nella mia risposta.
Aknuds1

Sono d'accordo, sembra che questo impianto idraulico sia già installato se si utilizza il modello di progetto dell'app Web.
longda,

@cuongle: web api versione 2.2 verrà installato con mvc 4? supporta MVC 4?
Thomas,

20

Prima di iniziare a unire i progetti MVC e API Web, suggerirei di leggere contro e contro per separarli come progetti diversi. Una cosa molto importante (la mia) sono i sistemi di autenticazione, che sono totalmente diversi.

Se è necessario utilizzare richieste autenticate su MVC e API Web, è necessario ricordare che l'API Web è RESTful (non è necessario mantenere la sessione, richieste HTTP semplici, ecc.), Ma MVC non lo è.

Per esaminare le differenze tra le implementazioni è sufficiente creare 2 diversi progetti in Visual Studio 2013 da Modelli: uno per MVC e uno per l'API Web (non dimenticare di attivare "Autenticazione individuale" durante la creazione). Vedrai molte differenze in AuthencationController.

Quindi, sii consapevole.


11

NOTA: questa è solo un'abbreviazione di questa risposta sopra

  1. Apri la console di gestione dei pacchetti NuGet ed esegui

    PM> Install-Package Microsoft.AspNet.WebApi
  2. Aggiungere riferimenti a System.Web.Routing, System.Web.Nete System.Net.HttpDLL se non è già presente

  3. Aggiungi la seguente classe

    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. Aggiungi Application_Startmetodo se non già presente (nel file global.asax.cs)

    protected void Application_Start()
    {
        //this should be line #1 in this method
        GlobalConfiguration.Configure(WebApiConfig.Register);
    }
  5. Cartella dei controller fare clic con il pulsante destro del mouse> aggiungi nuovo elemento> web> Aggiungi controller 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";
            }  
        }
    }

Dove stiamo esattamente aggiungendo riferimenti a System.Web.Routing, System.Web.Net e System.Net.Http?
gabed123

1
Dalla finestra di dialogo Aggiungi riferimento, apri quel dialogo e cerca i nomi di quegli assiemi, c'è una grande possibilità che siano già stati aggiunti. (ma solo per essere sicuri)
Hakan Fıstık

Il metodo Application_Start dovrebbe far parte della classe globale in Global.asax.cs?
gabed123

sì, ho aggiornato la mia risposta per dimostrarlo, che tu per la nota
Hakan Fıstık

1
@HakamFostok Questo mi ha aiutato. Grazie!
csichar,

3

La soluzione sopra funziona perfettamente. Preferisco scegliere l'opzione API Web durante la selezione del modello di progetto, come mostrato nella figura seguente

Nota: la soluzione funziona con Visual Studio 2013 o versione successiva. La domanda originale è stata posta nel 2012 ed è il 2016, aggiungendo quindi una soluzione Visual Studio 2013 o successiva.

Modello di progetto che mostra l'opzione API Web


2
Se stai creando un progetto che coinvolge l'API Web, sarebbe più semplice scegliere l'opzione API Web. L'opzione creerà tutti i file richiesti come indicato nelle risposte sopra.
Sankar Krishnamoorthy,

Il problema a portata di mano qui è in Visual Studio 2012 e mvc 4. Anche se la tua soluzione va bene, non puoi farlo in VS 2012
netfed

Questo è un buon punto e ho provato sopra la soluzione con VS 2013. Grazie @netfed per avermi fatto notare.
Sankar Krishnamoorthy,

Ciao a tutti, ho l'elemento API funzionante nella mia soluzione MVC, ma per impostazione predefinita ha cercato di eseguire la soluzione come soluzione API. Ma voglio che funzioni come una soluzione MVC come impostazione predefinita e quindi se vai nella posizione dell'API ecc., Esegui le API. Qualcun altro ha avuto questo problema ed è stato in grado di risolverlo? Grazie
Chris Cooper,

1

Ho avuto lo stesso problema, la soluzione era così semplice

Fare clic destro su solotion installare Microsoft.ASP.NET.WebApi da "Gestisci pacchetto Nuget per Sulotion"

boom è tutto;)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.