Как добавить веб-API в существующий проект веб-приложения ASP.NET MVC 4?

365

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

Дайте мне знать, если мне нужно предоставить более подробную информацию.

aknuds1
источник

Ответы:

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 должен быть установлен для работы вышеупомянутого.

aknuds1
источник
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/22/2013 - это последний пакет WebApi:

Install-Package Microsoft.AspNet.WebApi

Оригинальный ответ (это более старый пакет WebApi)

Install-Package AspNetWebApi

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

cdeutsch
источник
3
По состоянию на 2013 год это устаревший пакет, и вы хотите Install-Package Microsoft.AspNet.WebApiсейчас. См. Nuget.org/packages/Microsoft.AspNet.WebApi
Крис
70

Чтобы добавить WebAPI в мой проект MVC 5.

  1. Откройте консоль диспетчера пакетов NuGet и запустите

    PM> Install-Package Microsoft.AspNet.WebApi
  2. Добавить ссылки System.Web.Routing, System.Web.Netи System.Net.Httpdll, если не там уже

  3. Щелкните правой кнопкой мыши папку контроллеров> добавьте новый элемент> веб> Добавить контроллер веб-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>
kheya
источник
Пункт, который создал разницу, заключался в размещении WebApiconfig.Register в первой строке, как было упомянуто @kheya
Раджат
Я хотел бы добавить, что имя вашего контроллера API должно заканчиваться контроллером , как CarController (не только Car ) !!! Так много людей забывают об этом и получают сообщение об ошибке «Не найден тип, соответствующий контроллеру с именем {0} '»
1_bug
Чтобы быть более эффективным с этим хорошим ответом, вы можете игнорировать шаги 4, 8 и 9. (они не так важны). И если вы поменяете местами порядок шагов 5 и 6, они будут иметь больше смысла (лучше создать класс, чем используйте его, вместо того, чтобы использовать класс, а затем создайте его)
Hakan Fıstık
Где именно мы добавляем ссылки на System.Web.Routing, System.Web.Net и System.Net.Http?
gabed123
28

Как только вы добавляете «WebApi Controller» в папку контроллеров, Visual Studio автоматически заботится о зависимостях;

Visual Studio добавил полный набор зависимостей для ASP.NET Web API 2 в проект «MyTestProject».

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

  1. Добавьте следующие ссылки на пространство имен:

    используя System.Web.Http; использование System.Web.Routing;

  2. Если код еще не определяет метод Application_Start, добавьте следующий метод:

    protected void 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 и добавление контроллера web api 2.
ModChowdhury
Это было сделано в 2017 году, но мне пришлось обновить свои сборки WebApi. Мне также пришлось создать класс WebApiConfig вручную, docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/…
Джонни
22

Вы можете установить из Nuget как изображение ниже:

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

Или запустите приведенную ниже командную строку в консоли диспетчера пакетов:

Install-Package Microsoft.AspNet.WebApi
cuongle
источник
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, вы должны помнить, что веб-API является RESTful (не нужно поддерживать сеанс, простые HTTP-запросы и т. Д.), А MVC - нет.

Чтобы увидеть различия реализаций, просто создайте 2 разных проекта в Visual Studio 2013 из шаблонов: один для MVC и один для веб-API (не забудьте включить «Индивидуальную аутентификацию» во время создания). Вы увидите много различий в AuthencationControllers.

Так что будьте в курсе.

Ярков Антон
источник
11

ПРИМЕЧАНИЕ: это просто сокращение этого ответа выше

  1. Откройте консоль диспетчера пакетов NuGet и запустите

    PM> Install-Package Microsoft.AspNet.WebApi
  2. Добавить ссылки System.Web.Routing, System.Web.Netи System.Net.Httpdll, если не там уже

  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. Щелкните правой кнопкой мыши папку контроллеров> добавьте новый элемент> веб> Добавить контроллер веб-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
В диалоговом окне «Добавить ссылку» откройте этот диалог и выполните поиск названий этих сборок. Существует большая вероятность того, что они уже добавлены. (но только чтобы убедиться)
Хакан Фистик
Предполагается, что метод Application_Start является частью глобального класса в Global.asax.cs?
gabed123
да, я обновил свой ответ, чтобы продемонстрировать это, что вы для заметки
Хакан Фистик
1
@HakamFostok Это помогло мне. Спасибо!
Чичар
3

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

Примечание . Решение работает с Visual Studio 2013 или более поздней версии. Оригинальный вопрос был задан в 2012 году, и это 2016 год, поэтому добавляется решение Visual Studio 2013 или выше.

Шаблон проекта, показывающий параметр веб-API

Санкар Кришнамурты
источник
2
Если вы создаете проект, который включает в себя веб-API, было бы легче выбрать вариант веб-API. Опция создаст все необходимые файлы, как указано в ответах выше.
Санкар Кришнамурти
Здесь есть проблема в Visual studio 2012 и mvc 4. Хотя ваше решение просто отлично, вы не можете сделать это таким образом в VS 2012
netfed
Это хороший момент, и я попробовал вышеуказанное решение с VS 2013. Спасибо @netfed за указание.
Санкар Кришнамурти
Привет всем, у меня есть элемент API, работающий в моем решении MVC, но по умолчанию он пытался запустить решение как решение API. Но я хочу, чтобы оно работало как решение MVC по умолчанию, а затем, если вы перейдете к расположению API и т. Д., Запустите API. Кто-нибудь еще имел эту проблему и был в состоянии ее решить? Спасибо
Крис Купер
1

У меня была такая же проблема, решение было так легко

Щелкните правой кнопкой мыши на solotion и установите Microsoft.ASP.NET.WebApi из раздела «Управление пакетом Nuget для Sulotion».

бум вот оно;)

iDeveloper
источник