Wie füge ich eine Web-API zu einem vorhandenen ASP.NET MVC 4-Webanwendungsprojekt hinzu?

365

Ich möchte einem in Visual Studio 2012 entwickelten ASP.NET MVC 4-Webanwendungsprojekt eine ASP.NET-Web-API hinzufügen . Welche Schritte muss ich ausführen, um dem Projekt eine funktionierende Web-API hinzuzufügen? Ich bin mir bewusst, dass ich einen Controller brauche, der von ApiController abgeleitet ist, aber das ist ungefähr alles, was ich weiß.

Lassen Sie mich wissen, wenn ich weitere Details angeben muss.

aknuds1
quelle

Antworten:

455

Die Schritte, die ich ausführen musste, waren:

  1. Verweis auf hinzufügen System.Web.Http.WebHost.
  2. Hinzufügen App_Start\WebApiConfig.cs(siehe Codefragment unten).
  3. Namespace System.Web.Httpin importieren Global.asax.cs.
  4. Rufen Sie WebApiConfig.Register(GlobalConfiguration.Configuration)in MvcApplication.Application_Start()(in Datei Global.asax.cs), bevor die Standard Web Application Route wie die Registrierung sonst Vorrang haben würde.
  5. Fügen Sie einen Controller hinzu, der von abgeleitet ist System.Web.Http.ApiController.

Ich könnte dann aus dem Lernprogramm (Ihre erste ASP.NET-Web-API) genug lernen , um meinen API-Controller zu definieren.

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

Update 10.16.2015:

Word hat es, das NuGet-Paket Microsoft.AspNet.WebApi muss installiert sein, damit das oben genannte funktioniert.

aknuds1
quelle
12
Das war wirklich hilfreich. Ich musste auch einen Verweis hinzufügen System.Net.Http, aber ansonsten funktionierte es wie ein Zauber!
Christofer Eliasson
5
Ich habe auch ein Projekt von MVC3 auf 4 aktualisiert und musste außerdem einen Verweis auf System.Web.Http hinzufügen.
Damien Sawyer
3
Sie können jetzt nuget verwenden und über alle Änderungen auf dem Laufenden bleiben! nuget.org/packages/Microsoft.AspNet.WebApi
Chris
3
Ich würde dies nicht zum Laufen bringen, bis ich mein Web-API-Register geändert habe in: GlobalConfiguration.Configure (WebApiConfig.Register);
KingOfHypocrites
3
@LuisGouveia Ich denke, es ist zu spät, aber jemand anderes wird es wahrscheinlich schneller lösen, wenn ich das hatte. GlobalConfiguration.Configure (WebApiConfig.Register); in Global.asax steht vor RouteConfig.RegisterRoutes (RouteTable.Routes);
Maxim
77

UPDATE 22.11.2013 - Dies ist das neueste WebApi-Paket:

Install-Package Microsoft.AspNet.WebApi

Ursprüngliche Antwort (dies ist ein älteres WebApi-Paket)

Install-Package AspNetWebApi

Weitere Details .

cdeutsch
quelle
3
Ab 2013 ist das ein Legacy-Paket und Sie möchten Install-Package Microsoft.AspNet.WebApijetzt. Siehe nuget.org/packages/Microsoft.AspNet.WebApi
Chris
70

So fügen Sie WebAPI in mein MVC 5-Projekt ein

  1. Öffnen Sie die NuGet Package Manager-Konsole und führen Sie sie aus

    PM> Install-Package Microsoft.AspNet.WebApi
  2. Fügen Sie Verweise auf System.Web.Routing, System.Web.Netund System.Net.HttpDLLs , wenn es nicht schon

  3. Klicken Sie mit der rechten Maustaste auf den Ordner "Controller"> Neues Element hinzufügen> Web> Web-API-Controller hinzufügen

  4. Web.config wird von VS entsprechend geändert

  5. Application_StartMethode hinzufügen , falls noch nicht vorhanden

    protected void Application_Start()
    {
        //this should be line #1 in this method
        GlobalConfiguration.Configure(WebApiConfig.Register);
    }
  6. Fügen Sie die folgende Klasse hinzu (ich habe in der Datei global.asax.cs hinzugefügt)

    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. Ändern Sie die Web-API-Methode entsprechend

    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. Neu erstellen und testen

  9. Erstellen Sie eine einfache HTML-Seite

    <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
quelle
Der Punkt, der einen Unterschied verursachte, war das Platzieren des WebApiconfig.Register in der ersten Zeile, wie von @kheya
Rajat am
Ich möchte hinzufügen, dass Ihr API-Controller-Name mit Controller enden muss , wie CarController (nicht nur Car ) !!! So viele Leute vergessen es und erhalten die Fehlermeldung "Es wurde kein Typ gefunden, der dem Controller mit dem Namen {0} 'entspricht"
1_bug
Um mit dieser netten Antwort effizienter zu sein, können Sie die Schritte 4, 8 und 9 ignorieren. (Sie sind nicht so wichtig.) Wenn Sie die Reihenfolge der Schritte 5 und 6 vertauschen, sind sie sinnvoller (es ist dann besser, eine Klasse zu erstellen benutze es, anstatt die Klasse zu benutzen und erstelle es dann)
Hakan Fıstık
Wo genau fügen wir Verweise auf System.Web.Routing, System.Web.Net und System.Net.Http hinzu?
gabed123
28

Sobald Sie einen "WebApi Controller" im Ordner "Controller" hinzufügen, kümmert sich Visual Studio automatisch um Abhängigkeiten.

Visual Studio hat den vollständigen Satz von Abhängigkeiten für ASP.NET Web API 2 zum Projekt 'MyTestProject' hinzugefügt.

Für die Datei Global.asax.cs im Projekt sind möglicherweise zusätzliche Änderungen erforderlich, um die ASP.NET-Web-API zu aktivieren.

  1. Fügen Sie die folgenden Namespace-Referenzen hinzu:

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

  2. Wenn der Code noch keine Application_Start-Methode definiert, fügen Sie die folgende Methode hinzu:

    protected void Application_Start () {}

  3. Fügen Sie am Anfang der Application_Start-Methode die folgenden Zeilen hinzu:

    GlobalConfiguration.Configure (WebApiConfig.Register);

Teoman Shipahi
quelle
Dies ist bei weitem der einfachste Weg, dies jetzt zu erreichen.
Adam Smith
1
Funktioniert hier nicht. 1. Nuget: Install-Package Microsoft.AspNet.WebApi2. Fügen Sie das neue Element "Web API Controller Class (v2.1)" hinzu. Ergebnis: Fügt den API-Controller hinzu, ändert sich aber nicht Application_Start. Mit Owin.
Artyom
2
Dies ist die richtige Antwort, wenn Sie vs2015 haben - Update 3 und Hinzufügen von Web API 2 Controller.
ModChowdhury
Es war 2017, aber ich musste meine WebApi-Assemblys aktualisieren. Ich habe auch manuell die WebApiConfig Klasse zu erstellen, docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/...
johnny
22

Sie können von Nuget aus wie folgt installieren:

Geben Sie hier die Bildbeschreibung ein

Oder führen Sie die folgende Befehlszeile in der Package Manager-Konsole aus:

Install-Package Microsoft.AspNet.WebApi
cuongle
quelle
3
Was muss ich also noch tun, außer den Controller hinzuzufügen? Aus diesem Grund habe ich diese Frage an erster Stelle gestellt. Das Tutorial sagt dies nicht wirklich aus, da es von einem Web-API-Projekt ausgeht. Ich habe einen API-Controller hinzugefügt, der jedoch nicht weitergeleitet wird.
aknuds1
1
Das Tutorial war keine große Hilfe beim Hinzufügen einer Web-API zu einem vorhandenen Projekt, daher habe ich es aus einem Web-API-Projekt herausgefunden, wie in meiner Antwort beschrieben.
aknuds1
Ich stimme zu, es scheint, dass diese Installation bereits installiert ist, wenn Sie die Web App-Projektvorlage verwenden.
Longda
@cuongle: Web-API-Version 2.2 wird mit MVC 4 installiert? unterstützt es MVC 4?
Thomas
20

Bevor Sie mit dem Zusammenführen von MVC- und Web-API-Projekten beginnen, sollten Sie sich über Vor- und Nachteile informieren , um diese als unterschiedliche Projekte zu trennen. Eine sehr wichtige Sache (meine eigene) sind Authentifizierungssysteme, die völlig anders sind.

Wenn Sie authentifizierte Anforderungen sowohl für MVC als auch für die Web-API verwenden müssen, müssen Sie sich daran erinnern, dass die Web-API REST-fähig ist (Sitzung, einfache HTTP-Anforderungen usw. müssen nicht beibehalten werden), MVC jedoch nicht.

Um die Unterschiede bei den Implementierungen zu untersuchen, erstellen Sie einfach zwei verschiedene Projekte in Visual Studio 2013 aus Vorlagen: eines für MVC und eines für die Web-API (vergessen Sie nicht, während der Erstellung die Option "Individuelle Authentifizierung" zu aktivieren). Sie werden einen großen Unterschied bei AuthencationControllern feststellen.

Also sei dir bewusst.

Yarkov Anton
quelle
11

HINWEIS: Dies ist nur eine Abkürzung dieser Antwort oben

  1. Öffnen Sie die NuGet Package Manager-Konsole und führen Sie sie aus

    PM> Install-Package Microsoft.AspNet.WebApi
  2. Fügen Sie Verweise auf System.Web.Routing, System.Web.Netund System.Net.HttpDLLs , wenn es nicht schon

  3. Fügen Sie die folgende Klasse hinzu

    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. In Application_StartMethode , wenn nicht bereits (in global.asax.cs - Datei)

    protected void Application_Start()
    {
        //this should be line #1 in this method
        GlobalConfiguration.Configure(WebApiConfig.Register);
    }
  5. Klicken Sie mit der rechten Maustaste auf den Ordner "Controller"> Neues Element hinzufügen> Web> Web-API-Controller hinzufügen

    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
quelle
Wo genau fügen wir Verweise auf System.Web.Routing, System.Web.Net und System.Net.Http hinzu?
gabed123
1
Öffnen Sie diesen Dialog im Dialogfeld "Referenz hinzufügen" und suchen Sie nach den Namen dieser Assemblys. Es besteht eine große Chance, dass sie bereits hinzugefügt wurden. (aber nur um sicher zu gehen)
Hakan Fıstık
Soll die Application_Start-Methode Teil der globalen Klasse in Global.asax.cs sein?
gabed123
Ja, ich habe meine Antwort aktualisiert, um zu demonstrieren, dass Sie für die Notiz
Hakan Fıstık
1
@ HakamFostok Das hat mir geholfen. Vielen Dank!
Csichar
3

Die obige Lösung funktioniert perfekt. Ich bevorzuge die Web-API-Option, während ich die Projektvorlage auswähle (siehe Abbildung unten)

Hinweis: Die Lösung funktioniert mit Visual Studio 2013 oder höher. Die ursprüngliche Frage wurde 2012 gestellt und ist 2016, daher wird eine Lösung für Visual Studio 2013 oder höher hinzugefügt.

Projektvorlage mit Web-API-Option

Sankar Krishnamoorthy
quelle
2
Wenn Sie ein Projekt mit Web-API erstellen, ist es einfacher, die Web-API-Option auszuwählen. Die Option erstellt alle erforderlichen Dateien, wie in den obigen Antworten erwähnt.
Sankar Krishnamoorthy
Das Problem, das hier vorliegt, ist in Visual Studio 2012 und MVC 4. Obwohl Ihre Lösung in Ordnung ist, können Sie es in VS 2012 nicht auf diese Weise tun
netfed
Dies ist ein guter Punkt, und ich habe die obige Lösung mit VS 2013 ausprobiert. Vielen Dank an @netfed für den Hinweis.
Sankar Krishnamoorthy
Hallo zusammen, das API-Element funktioniert in meiner MVC-Lösung, aber standardmäßig wurde versucht, die Lösung als API-Lösung auszuführen. Ich möchte jedoch, dass es standardmäßig als MVC-Lösung ausgeführt wird. Wenn Sie dann zum API-Speicherort usw. gehen, führen Sie die APIs aus. Hat jemand anderes dieses Problem gehabt und konnte es beheben? Vielen Dank
Chris Cooper
1

Ich hatte das gleiche Problem, die Lösung war so einfach

Klicken Sie mit der rechten Maustaste auf solotion. Installieren Sie Microsoft.ASP.NET.WebApi unter "Nuget-Paket für Sulotion verwalten".

Boom das war's;)

iDeveloper
quelle