Web API в решении MVC в отдельном проекте

Я создаю новый проект MVC4, и исследование побудило меня поверить, что связь с javascript на стороне сервера лучше достигается теперь через веб-интерфейс API, а не действия контроллера. Я правильно понимаю это?

Я предполагаю, что я могу делиться всеми моими атрибутами и т.д. между веб-API и контроллерами MVC, поэтому на первый взгляд это не кажется значительным изменением для меня.

Когда я настраиваю приложения, мне нравится разбивать компоненты на проекты. Мой план состоял в том, чтобы иметь проект MVC и проект веб-API. Но я столкнулся с проблемами. Например, я закончил с двумя приложениями как таковыми, отдельную настройку маршрутизации и т.д. И т.д.

Итак, мой вопрос заключается в том, что в приложении MVC структура веб-API находится в одном проекте или же веб-API должен быть разделен на собственный проект и устранять проблемы?

Ответ 1

К сожалению, вы ошибаетесь в этом - я полагаю, что я могу делиться всеми моими атрибутами и т.д. между web-api и mvc-контроллерами, поэтому на первый взгляд это не кажется значительным изменением для меня.

Многие из концепций, используемых Web API и MVC, даже если они похожи на первый взгляд, на самом деле несовместимы. Например, атрибуты Web API являются System.Web.Http.Filters.Filter, а атрибуты MVC System.Web.Mvc.Filter - и они не являются взаимозаменяемыми.

То же самое относится ко многим другим понятиям - привязке модели (совершенно разные механизмы), маршрутам (веб-API использует HTTPRoutes not Routes, хотя оба они работают на одном и том же базовом RouteTable), зависимый преобразователь (несовместимый) и т.д. аналогичные на поверхности, на практике очень различны. Более того, веб-API не имеет концепции областей.

В конечном счете, если все, чего вы пытаетесь достичь, - это "новый, модный" способ обслуживания контента JSON - подумайте дважды, прежде чем идти по этому пути. Я, конечно, не рекомендую рефакторинг любого существующего кода, если вы действительно не изучаете HTTP и не создаете свое приложение в RESTful пути.

Все зависит от того, что вы строите. Если вы начинаете новый проект, и все, что вам нужно, это обслуживать некоторые JSON для облегчения вашего веб-приложения - если вы захотите жить с каким-то потенциально дублированным кодом (например, материал, о котором я упоминал выше), Web API может быть легко размещен внутри тот же проект, что и ASP.NET MVC.

Я бы отделил веб-API только от отдельного проекта, если вы собираетесь создать подходящий API для своего онлайн-сервиса - возможно, его потребляете внешние клиенты или различные устройства, например, заправляете мобильными приложениями.

Ответ 2

IMO, безопасность и развертывание должны принять ваше решение. Например, если ваше приложение MVC использует проверку подлинности с помощью форм, но вы заинтересованы в использовании базовой проверки подлинности (с SSL) для вашего API, отдельные проекты сделают вашу жизнь проще. Если вы хотите разместить сайт yout на веб-сайте www.example.com, но размещаете свой API как api.example.com(по сравнению с www.example.com/api), отдельные проекты облегчат вашу жизнь. Если вы отделите свои проекты и поддомен им соответственно, и вы намереваетесь использовать свой собственный API из своего приложения MVC, вам придется выяснить, как справиться с Same Origin Policy для клиентских вызовов вашего API. Общим решением для этого является использование jsonp или CORS (желательно если вы можете).

Обновление (3/26/2013): ожидается официальная поддержка CORS: http://aspnetwebstack.codeplex.com/wikipage?title=CORS%20support%20for%20ASP.NET%20Web%20API

Ответ 3

После некоторого опыта (создание API для приложений и для mvc). Я в основном делаю то и другое.

Я создаю отдельный проект для вызовов api, которые поступают от других клиентов или других устройств (приложений Android/IOS). Одна из причин заключается в том, что аутентификация различна, она основана на токенах (чтобы сохранить ее без гражданства). Я не хочу смешивать это в своем приложении MVC.

Для моего javascript/jquery api вызывает мое приложение mvc, мне нравится держать все в порядке, поэтому я включаю веб-api внутри моего приложения MVC. Я не намерен иметь аутентификацию на токенах с помощью java-скриптов api, потому что он в одном приложении. Я могу просто использовать атрибут [authorize] на конечной точке API, когда пользователь не войдет в систему, он не получит данные.

Кроме того, при работе с корзинами покупок и вы хотите хранить корзину пользователя в сеансе (хотя и не вошли в систему), вам также нужно иметь это в своем API, если вы добавляете/удаляете продукты через код javascript. Это наверняка сделает ваш API завершенным, но также уменьшит сложность вашего MVC-API.

Ответ 5

Недавно я сделал почти то же самое: я начал с нового проекта веб-приложений MVC 4, выбрав шаблон веб-API в VS2012.

Это создаст веб-API, размещенный в том же приложении, что и MVC.

Я хотел переместить ApiControllers в отдельный проект библиотеки классов. Это было довольно просто, но решение было немного скрыто.

В AssemblyInfo.cs проекта MVC 4 добавьте аналогичную строку кода

[assembly: PreApplicationStartMethod(typeof(LibraryRegistrator), "Register")]

Теперь вам нужен класс LibraryRegistrator (не стесняйтесь называть его чем угодно)

public class LibraryRegistrator
    {
        public static void Register()
        {
            BuildManager.AddReferencedAssembly(Assembly.LoadFrom(HostingEnvironment.MapPath("~/bin/yourown.dll")));
        }
    }

В проекте MVC 4 также добавьте ссылку на библиотеку Api.

Теперь вы можете добавить контроллеры Api в свою собственную библиотеку классов (yourown.dll).

Ответ 6

Даже если ваш проект настолько сложный, чтобы оправдать два "передних конца", я бы все же подумал о том, чтобы разделить webapi на отдельный проект в качестве последнего средства. У вас будут проблемы с развертыванием, и новичкам будет сложно понять структуру вашего решения. Не говоря уже о проблемах маршрутизации.

Я хотел бы сохранить пространство имен system.web, изолированное в одном "слое представления". Несмотря на то, что webapi не является презентационным, он все еще является частью интерфейса вашего приложения. Пока вы держите логику в своем домене, а не контроллеры, вы не должны сталкиваться с множеством проблем. Кроме того, не забудьте воспользоваться Областями.

Ответ 7

В дополнение к настройке отдельной DLL для Web.Api.

Просто предложение:

  • Создать проект
  • Nugget WebActivatorEx
  • Создайте класс Метод, который нужно вызвать в app_start

    [сборка: WebActivatorEx.PostApplicationStartMethod(typeof (API.AppWebActivator), "Пуск" )]

    [сборка: WebActivatorEx.ApplicationShutdownMethod(typeof (API.AppWebActivator), "Shutdown" )]

  • Зарегистрируйте маршруты web.api внутри метода запуска

    public static void Start() {   GlobalConfiguration.Configure(WebApiConfig.Register); }

  • Ссылка на проект на веб-проект. для активации метода запуска.

Надеюсь, что это поможет.

Ответ 8

Я попытался разбить контроллеры API на новый проект. Все, что я сделал, это создать новый проект библиотеки, переместив контроллеры внутри папки с именем API. Затем добавлена ​​ссылка проекта библиотеки на проект MVC.

Конфигурация webAPI остается в самом проекте MVC. Он отлично работает.