Як додати веб-API до існуючого проекту веб-додатків ASP.NET MVC 4?


365

Я хочу додати веб-API ASP.NET до проекту веб-додатків ASP.NET MVC 4, розробленого в Visual Studio 2012. Які кроки потрібно виконати, щоб додати функціонуючий веб-API до проекту? Я знаю, що мені потрібен контролер, що походить від ApiController, але це майже все, що я знаю.

Повідомте мене, якщо мені потрібно надати більше деталей.

Відповіді:


455

Кроки, які мені потрібно було виконати:

  1. Додати посилання на System.Web.Http.WebHost.
  2. Додати App_Start\WebApiConfig.cs(див. Фрагмент коду нижче).
  3. Імпортуйте простір імен System.Web.Httpу Global.asax.cs.
  4. Телефонуйте WebApiConfig.Register(GlobalConfiguration.Configuration)в MvcApplication.Application_Start()(в файлі Global.asax.cs), перед тим реєстрації маршруту веб - зі стандартними програмами, які в іншому випадку пріоритет.
  5. Додайте контролер, похідний від System.Web.Http.ApiController.

Тоді я міг би навчитися достатньо з підручника (Ваш перший веб-API ASP.NET), щоб визначити мій контролер 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);
}

Оновлення 16.10.2015:

Word має, пакет NuGet Microsoft.AspNet.WebApi повинен бути встановлений для роботи вище.


12
Це було дуже корисно. Мені довелося також додати посилання System.Net.Http, але крім цього, це спрацювало як шарм!
— Крістофер Еліассон

5
Я також оновив проект з MVC3 до 4, а також потрібно додати посилання на System.Web.Http.
— Демієн Сойєр

3
Ви можете використовувати nuget зараз і бути в курсі всіх змін, що трапляються! nuget.org/packages/Microsoft.AspNet.WebApi
— Кріс

3
Я б не працював над цим, поки я не змінив свій веб-реєстр api на: GlobalConfiguration.Configure (WebApiConfig.Register);
— KingOfHypocrites

3
@LuisGouveia Я думаю, це пізно, але хтось інший, ймовірно, вирішить це швидше, якщо це те, що я мав. GlobalConfiguration.Configure (WebApiConfig.Register); у Global.asax йде перед RouteConfig.RegisterRoutes (RouteTable.Routes);
— Максим

77

ОНОВЛЕННЯ 22.11.2013 - це останній пакет WebApi:

Install-Package Microsoft.AspNet.WebApi

Оригінальна відповідь (це старіший пакет WebApi)

Install-Package AspNetWebApi

Більше деталей .


3
Станом на 2013 рік, це старий пакет, який ви хочете Install-Package Microsoft.AspNet.WebApiзараз. Дивіться nuget.org/packages/Microsoft.AspNet.WebApi
— Кріс

70

Щоб додати WebAPI до свого проекту MVC 5

  1. Відкрийте консоль менеджера NuGet Package та запустіть

    PM> Install-Package Microsoft.AspNet.WebApi
  2. Додайте посилання на System.Web.Routing, System.Web.Netі System.Net.Httpdlls, якщо вони вже не існують

  3. Клацніть папку контролерів правою кнопкою миші> додайте новий елемент> веб> Додати контролер Web API

  4. Web.config буде змінено відповідно VS

  5. Додайте Application_Startметод, якщо його вже немає

    protected void Application_Start()
    {
        //this should be line #1 in this method
        GlobalConfiguration.Configure(WebApiConfig.Register);
    }
  6. Додайте наступний клас (я додав у файл 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. Змініть відповідний метод веб-api

    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. Перебудувати і протестувати

  9. Створіть просту сторінку 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>

Різниця, яка створила різницю, - розміщення WebApiconfig.Register у першому рядку, про що згадував @kheya
— Rajat

Я хотів би додати, назва вашого контролера api має закінчуватися контролером , як CarController (не лише Car ) !!! Так багато людей забувають про це і отримують повідомлення про помилку "Не знайдено тип, який відповідає контролеру на ім'я {0} '"
— 1_буг

Щоб бути ефективнішою з цієї приємної відповіді, ви можете ігнорувати кроки 4, 8 та 9. (вони не так важливі). Якщо ви поміняєте порядок кроків 5 і 6, вони матимуть більше сенсу (краще створити клас тоді використовуйте його, а не використовуйте клас, тоді створіть його)
— Hakan Fıstık

Де саме ми додаємо посилання на System.Web.Routing, System.Web.Net і System.Net.Http?
— gabed123

28

Як тільки ви додасте "контролер WebApi" в папку контролерів, Visual Studio автоматично піклується про залежності;

Visual Studio додав повний набір залежностей для ASP.NET Web API 2 до проекту "MyTestProject".

Файл Global.asax.cs у проекті може потребувати додаткових змін для включення веб-API ASP.NET.

  1. Додайте такі посилання на область імен:

    за допомогою System.Web.Http; за допомогою System.Web.Routing;

  2. Якщо код вже не визначає метод Application_Start, додайте наступний метод:

    захищена недійсність Application_Start () {}

  3. Додайте наступні рядки до початку методу Application_Start:

    GlobalConfiguration.Configure (WebApiConfig.Register);


Зараз це найпростіший спосіб досягти.
— Адам Сміт

1
Тут не працює. 1. Nuget: Install-Package Microsoft.AspNet.WebApi2. Додати новий елемент "Клас контролера Web API (v2.1)". Результат: додає контролер api, але не змінюється Application_Start. З Овіном.
— Артем

2
це правильна відповідь, коли у вас vs2015 - оновлення 3 та додавання веб-контролера api 2.
— ModChowdhury

Це було у 2017 році, але мені довелося оновити мої збірки WebApi. Мені також довелося створити клас WebApiConfig вручну, docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/…
— Johnny

22

Ви можете встановити з nuget як зображення нижче:

введіть тут опис зображення

Або запустіть командний рядок нижче на консолі диспетчера пакунків:

Install-Package Microsoft.AspNet.WebApi

3
Отже, що ще мені потрібно зробити, крім додати контролер? Ось чому я опублікував це питання в першу чергу, підручник насправді не говорить, оскільки передбачає проект Web API. Я додав контролер API, але він не маршрутизований.
— aknuds1

1
Навчальний посібник не дуже допомагає щодо додавання Web API до вже існуючого проекту, тому я з’ясував це з проекту Web API, як було викладено у моїй відповіді.
— aknuds1

Я згоден, здається, що ця сантехніка вже встановлена, якщо ви використовуєте шаблон проекту Web App.
— longda

@cuongle: веб-api версії 2.2 буде встановлено з mvc 4? чи підтримує MVC 4?
— Томас

20

Перш ніж розпочати об’єднання проектів MVC та Web API, я б запропонував прочитати про мінуси та плюси, щоб розділити їх як різні проекти. Одна дуже важлива річ (моя власна) - це системи аутентифікації, які абсолютно різні.

Якщо вам потрібно використовувати автентифіковані запити як на MVC, так і на веб-API, вам потрібно пам’ятати, що Web API є RESTful (не потрібно тримати сеанс, прості запити HTTP тощо), але MVC це не так.

Щоб побачити відмінності в реалізації, просто створіть у Visual Studio 2013 із шаблонів два різні проекти: один для MVC та один для веб-API (не забудьте увімкнути "Індивідуальну автентифікацію" під час створення). Ви побачите велику різницю в AuthencationControllers.

Отже, будьте в курсі.


11

ПРИМІТКА: це лише скорочення цієї відповіді вище

  1. Відкрийте консоль менеджера NuGet Package та запустіть

    PM> Install-Package Microsoft.AspNet.WebApi
  2. Додайте посилання на System.Web.Routing, System.Web.Netі System.Net.Httpdlls, якщо вони вже не існують

  3. Додайте наступний клас

    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. Додати Application_Startметод, якщо його вже немає (у файлі global.asax.cs)

    protected void Application_Start()
    {
        //this should be line #1 in this method
        GlobalConfiguration.Configure(WebApiConfig.Register);
    }
  5. Клацніть папку контролерів правою кнопкою миші> додайте новий елемент> веб> Додати контролер Web API

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

Де саме ми додаємо посилання на System.Web.Routing, System.Web.Net і System.Net.Http?
— gabed123

1
З діалогового вікна "Додати довідник" відкрийте діалог та знайдіть назви цих зборів, є велика ймовірність того, що вони вже додані. (але лише для того, щоб переконатися)
— Hakan Fıstık

Чи повинен метод Application_Start бути частиною глобального класу в Global.asax.cs?
— gabed123

так, я оновив свою відповідь, щоб продемонструвати це, що ви для замітки
— Hakan Fıstık

1
@HakamFostok Це мені допомогло. Дякую!
— csichar

3

Вищеописане рішення працює чудово. Я вважаю за краще вибирати варіант Web API під час вибору шаблону проекту, як показано на малюнку нижче

Примітка: рішення працює з Visual Studio 2013 або новішою версією. Оригінальне запитання було задано у 2012 році та в 2016 році, тому додамо рішення Visual Studio 2013 або вище.

Шаблон проекту, що показує параметр веб-API


2
Якщо ви створюєте проект, що включає Web API, було б простіше вибрати варіант Web API. Цей параметр створить усі необхідні файли, як зазначено у вищезазначених відповідях.
— Санкар Кришнаморті

Проблема тут у Visual studio 2012 та mvc 4. Хоча ваше рішення просто чудове, ви не можете зробити це таким чином у VS 2012
— netfed

Це хороший момент, і я спробував вище рішення з VS 2013. Дякую @netfed за вказівку.
— Санкар Крішнаморті

Привіт усім, у мене елемент API працює в моєму рішенні MVC, але за замовчуванням він намагався запустити рішення як рішення API. Але я хочу, щоб воно працювало як рішення MVC за замовчуванням, а потім, якщо ви переходите до місця розташування API тощо, запустіть API. Спасибі
— Кріс Купер

1

У мене була така ж проблема, рішення було таким простим

Клацніть правою кнопкою миші на сольовій установці Microsoft.ASP.NET.WebApi з "Управління Nuget Package for Sulotion"

бум, це все;)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.