Jak dodać interfejs API sieci Web do istniejącego projektu aplikacji sieciowej ASP.NET MVC 4?

365

Chcę dodać interfejs API sieci Web ASP.NET do projektu aplikacji sieci Web ASP.NET MVC 4, opracowanego w Visual Studio 2012. Jakie kroki należy wykonać, aby dodać działający interfejs API sieci Web do projektu? Wiem, że potrzebuję kontrolera pochodzącego z ApiController, ale to wszystko, co wiem.

Daj mi znać, jeśli będę musiał podać więcej szczegółów.

aknuds1
źródło

Odpowiedzi:

455

Kroki, które musiałem wykonać to:

  1. Dodaj odniesienie do System.Web.Http.WebHost.
  2. Dodaj App_Start\WebApiConfig.cs(patrz fragment kodu poniżej).
  3. Zaimportuj przestrzeń nazw System.Web.Httpdo Global.asax.cs.
  4. Zadzwoń WebApiConfig.Register(GlobalConfiguration.Configuration)na MvcApplication.Application_Start()(w pliku Global.asax.cs), zanim rejestracji trasy domyślnej aplikacji sieci Web jako że w przeciwnym razie ma pierwszeństwo.
  5. Dodaj kontroler pochodzący z System.Web.Http.ApiController.

Mógłbym wtedy nauczyć się wystarczająco dużo z samouczka (Twój pierwszy interfejs API sieci Web ASP.NET), aby zdefiniować kontroler 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);
}

Aktualizacja 10.16.2015:

Word ma to, pakiet NuGet Microsoft.AspNet.WebApi musi być zainstalowany, aby powyższe działało.

aknuds1
źródło
12
To było bardzo pomocne. Musiałem również dodać odniesienie System.Net.Http, ale poza tym działało to jak urok!
Christofer Eliasson
5
Zaktualizowałem również projekt z MVC3 do 4, a także potrzebowałem dodać odniesienie do System.Web.Http.
Damien Sawyer
3
Możesz teraz korzystać z nugetu i być na bieżąco z wszelkimi wprowadzanymi zmianami! nuget.org/packages/Microsoft.AspNet.WebApi
Chris
3
Nie działałbym, dopóki nie zmienię mojego rejestru interfejsu API na: GlobalConfiguration.Configure (WebApiConfig.Register);
KingOfHypocrites
3
@LuisGouveia Myślę, że jest za późno, ale ktoś inny prawdopodobnie rozwiąże to szybciej, jeśli to właśnie miałem. GlobalConfiguration.Configure (WebApiConfig.Register); w Global.asax idzie przed RouteConfig.RegisterRoutes (RouteTable.Routes);
Maxim,
77

AKTUALIZACJA 22.11.2013 - to najnowszy pakiet WebApi:

Install-Package Microsoft.AspNet.WebApi

Oryginalna odpowiedź (jest to starszy pakiet WebApi)

Install-Package AspNetWebApi

Więcej szczegółów .

Cdeutsch
źródło
3
Począwszy od 2013 roku, jest to pakiet starszego typu i Install-Package Microsoft.AspNet.WebApijuż teraz chcesz . Zobacz nuget.org/packages/Microsoft.AspNet.WebApi
Chris
70

Aby dodać WebAPI do mojego projektu MVC 5.

  1. Otwórz konsolę menedżera pakietów NuGet i uruchom

    PM> Install-Package Microsoft.AspNet.WebApi
  2. Dodaj odniesień do System.Web.Routing, System.Web.Neti System.Net.Httpbibliotek DLL, jeśli nie ma już

  3. Kliknij folder kontrolerów prawym przyciskiem myszy> dodaj nowy element> sieć> Dodaj kontroler API sieci Web

  4. Web.config zostanie odpowiednio zmodyfikowany przez VS

  5. Dodaj Application_Startmetodę, jeśli jeszcze jej nie ma

    protected void Application_Start()
    {
        //this should be line #1 in this method
        GlobalConfiguration.Configure(WebApiConfig.Register);
    }
  6. Dodaj następującą klasę (dodałem w pliku 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. Zmodyfikuj odpowiednio metodę interfejsu API sieci 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";
            }
    
            // GET api/<controller>/5   : url to use => api/vs/5
            public string Get(int id)
            {
                return (id + 1).ToString();
            }
        }
    }
  8. Przebuduj i przetestuj

  9. Zbuduj prostą stronę 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>
kheya
źródło
Punktem, który spowodował różnicę, było umieszczenie WebApiconfig.Register w pierwszej linii, jak wspomniał @kheya
Rajat
Chciałbym dodać, że nazwa kontrolera interfejsu API musi kończyć się na kontrolerze , takim jak CarController (nie tylko Car ) !!! Tak wiele osób zapomina o tym i otrzymuje komunikat o błędzie „Nie znaleziono typu, który pasuje do kontrolera o nazwie {0}” ”
1_bug
Aby być bardziej wydajnym dzięki tej miłej odpowiedzi, możesz zignorować kroki 4, 8 i 9. (nie są one tak istotne) A jeśli zamienisz kolejność kroków 5 i 6, będą one miały większy sens (lepiej jest utworzyć klasę niż użyj go, zamiast użyć klasy, a następnie utwórz ją)
Hakan Fıstık
Gdzie dokładnie dodajemy odniesienia do System.Web.Routing, System.Web.Net i System.Net.Http?
gabed123
28

Jak tylko dodasz „kontroler WebApi” w folderze kontrolerów, Visual Studio automatycznie zajmie się zależnościami;

Program Visual Studio dodał pełny zestaw zależności dla ASP.NET Web API 2 do projektu „MyTestProject”.

Plik Global.asax.cs w projekcie może wymagać dodatkowych zmian, aby włączyć interfejs API sieci Web ASP.NET.

  1. Dodaj następujące odwołania do przestrzeni nazw:

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

  2. Jeśli kod nie definiuje jeszcze metody Application_Start, dodaj następującą metodę:

    protected void Application_Start () {}

  3. Dodaj następujące wiersze na początku metody Application_Start:

    GlobalConfiguration.Configure (WebApiConfig.Register);

Teoman Shipahi
źródło
Jest to zdecydowanie najłatwiejszy sposób na osiągnięcie tego teraz.
Adam Smith
1
Nie działa tutaj. 1. Nuget: Install-Package Microsoft.AspNet.WebApi2. Dodaj nowy element „Klasa kontrolera API sieci Web (v2.1)”. Wynik: dodaje kontroler interfejsu API, ale się nie zmienia Application_Start. Z Owinem.
Artem
2
to właściwa odpowiedź, gdy masz vs2015 - aktualizacja 3 i dodanie kontrolera interfejsu API sieci Web 2.
ModChowdhury
Tak było w 2017 r., Ale musiałem zaktualizować swoje zestawy WebApi. Musiałem także ręcznie utworzyć klasę WebApiConfig
johnny
22

Możesz zainstalować z nuget jak na poniższym obrazku:

wprowadź opis zdjęcia tutaj

Lub uruchom poniższy wiersz poleceń w konsoli Menedżera pakietów:

Install-Package Microsoft.AspNet.WebApi
cuongle
źródło
3
Co jeszcze muszę zrobić oprócz dodania kontrolera? Dlatego właśnie zadałem to pytanie, samouczek tak naprawdę nie mówi, ponieważ zakłada projekt interfejsu API sieci Web. Dodałem kontroler API, ale nie jest on przekierowany.
aknuds1,
1
Samouczek nie był zbyt pomocny w dodawaniu interfejsu API sieci Web do istniejącego projektu, więc wymyśliłem go z projektu interfejsu API sieci Web, jak opisano w mojej odpowiedzi.
aknuds1,
Zgadzam się, wygląda na to, że ta instalacja hydrauliczna jest już zainstalowana, jeśli używasz szablonu projektu aplikacji sieci Web.
longda
@cuongle: web api wersja 2.2 zostanie zainstalowana z mvc 4? czy obsługuje MVC 4?
Thomas
20

Zanim zaczniesz łączyć projekty MVC i Web API, proponuję przeczytać o wadach i zaletach, aby rozdzielić je jako różne projekty. Jedną bardzo ważną rzeczą (moją) są systemy uwierzytelniania, które są zupełnie inne.

JEŚLI musisz używać uwierzytelnionych żądań zarówno w interfejsie MVC, jak i interfejsie API sieci Web, musisz pamiętać, że interfejs API sieci Web jest w stanie RESTful (nie trzeba utrzymywać sesji, prostych żądań HTTP itp.), Ale MVC nie.

Aby zobaczyć różnice w implementacjach, po prostu stwórz 2 różne projekty w Visual Studio 2013 z szablonów: jeden dla MVC i jeden dla Web API (nie zapomnij włączyć „Indywidualnego uwierzytelnienia” podczas tworzenia). Zobaczysz dużą różnicę w AuthencationControllers.

Bądź więc świadomy.

Yarkov Anton
źródło
11

UWAGA: jest to po prostu skrót od tej odpowiedzi powyżej

  1. Otwórz konsolę menedżera pakietów NuGet i uruchom

    PM> Install-Package Microsoft.AspNet.WebApi
  2. Dodaj odniesień do System.Web.Routing, System.Web.Neti System.Net.Httpbibliotek DLL, jeśli nie ma już

  3. Dodaj następującą klasę

    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. Dodaj Application_Startmetodę, jeśli jeszcze jej nie ma (w pliku global.asax.cs)

    protected void Application_Start()
    {
        //this should be line #1 in this method
        GlobalConfiguration.Configure(WebApiConfig.Register);
    }
  5. Kliknij folder kontrolerów prawym przyciskiem myszy> dodaj nowy element> sieć> Dodaj kontroler API sieci 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
źródło
Gdzie dokładnie dodajemy odniesienia do System.Web.Routing, System.Web.Net i System.Net.Http?
gabed123
1
W oknie dialogowym Dodaj odniesienie otwórz ten dialog i wyszukaj nazwy tych zespołów, istnieje duża szansa, że ​​zostały już dodane. (ale dla pewności)
Hakan Fıstık
Czy metoda Application_Start powinna być częścią globalnej klasy w Global.asax.cs?
gabed123
tak, zaktualizowałem moją odpowiedź, aby wykazać, że za notatkę
Hakan Fıstık
1
@HakamFostok To mi pomogło. Dziękuję Ci!
csichar
3

Powyższe rozwiązanie działa idealnie. Wolę wybrać opcję Web API podczas wybierania szablonu projektu, jak pokazano na poniższym obrazku

Uwaga: Rozwiązanie działa z Visual Studio 2013 lub nowszym. Pierwotne pytanie zostało zadane w 2012 roku i jest to rok 2016, dlatego dodano rozwiązanie Visual Studio 2013 lub nowszy.

Szablon projektu pokazujący opcję interfejsu API sieci

Sankar Krishnamoorthy
źródło
2
Jeśli tworzysz projekt z interfejsem API sieci Web, łatwiej byłoby wybrać opcję interfejsu API sieci Web. Opcja utworzy wszystkie wymagane pliki, jak wspomniano w powyższych odpowiedziach.
Sankar Krishnamoorthy,
Problem jest tutaj w Visual Studio 2012 i mvc 4. Chociaż twoje rozwiązanie jest w porządku, nie możesz tego zrobić w VS 2012
netfed
To dobra uwaga i wypróbowałem powyższe rozwiązanie w VS 2013. Dzięki @netfed za wskazanie.
Sankar Krishnamoorthy
Cześć wszystkim, mam element API działający w moim rozwiązaniu MVC, ale domyślnie próbował uruchomić to rozwiązanie jako rozwiązanie API. Ale chcę, aby działało domyślnie jako rozwiązanie MVC, a następnie, jeśli przejdziesz do lokalizacji interfejsu API itp., Uruchom interfejsy API. Czy ktoś jeszcze miał ten problem i był w stanie go rozwiązać? Dzięki
Chris Cooper
1

Miałem ten sam problem, rozwiązanie było takie proste

Kliknij prawym przyciskiem myszy Solotion, zainstaluj Microsoft.ASP.NET.WebApi z „Manage Nuget Package for Sulotion”

boom to wszystko;)

iDeveloper
źródło