Як додати веб-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.