2012-06-17 2 views
31

Я пытаюсь добавить некоторую поддержку WebAPI на мой сайт asp.net 4 RC и хочу поместить его в область. Я видел, что кому-то удалось запустить эту бета-версию (here), но, честно говоря, понятия не имею, что я делаю в RC.Поддержка ASP.Net WebAPI

Неужели кому-нибудь удалось добавить поддержку области в RC WebAPI?

ответ

56

Вы можете поместить контроллеры Api в любую папку, которая вам нравится, вам не нужно создавать область, как вы делали для MVC. Обычно я создаю вложенную папку «Api» внутри папки «Контроллеры» на сайте MVC. Просто зарегистрируйте маршруты для своих контроллеров Api, и это сработает.

+3

Спасибо. Оказывается, что ничто мое не работало, потому что я зарегистрировал my/api/route после маршрута по умолчанию, который захватывал все вызовы api. –

+0

Могу ли я иметь 2 Global.asax как для WebAPI, так и для сайта asp.net 4? – Cris

+0

Помогите, вы сделали мой день! Большое спасибо. – Rikki

4

Убедитесь, что вы зарегистрировали маршрут API до маршрута по умолчанию, иначе маршрут по умолчанию будет с жадностью захватить все!

13

ASP.NET MVC 4 не поддерживает WebAPI в Районах.

Для этого можно расширить DefaultHttpControllerSelector, но вы должны внимательно прочитать эту превосходную (и короткую) статью: ASP.NET MVC 4 RC: Getting WebApi and Areas to play nicely. Он отлично работает.

Я успешно протестировал это решение с портативными зонами (MVCContrib). В принципе, вы должны:

  • Пут методы расширения «AreaRegistrationContextExtensions» в проекте PA (требуется от PortableAreaRegistration.RegisterArea() метода): вы можете скопировать статический класс в проект PA, но я предлагаю, чтобы поместить его в общий проект ,
  • Добавить класс «AreaHttpControllerSelector» (унаследованный от DefaultHttpControllerSelector) в проект-хост.
  • Добавить в Global.asax App_Start() следующую строку:

    GlobalConfiguration.Configuration.Services.Replace (TypeOf (IHttpControllerSelector), новый AreaHttpControllerSelector (GlobalConfiguration.Configuration));

Существует один нюанс с реализацией AreaHttpControllerSelector: название области должны соответствовать пространству имен ApiController в. Например, это мой PortableAreaRegistration класс:

namespace PortableAreasSample.MembershipArea 
{ 
    using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Web; 
    using MvcContrib.PortableAreas; 
    using System.Web.Http; 
    using System.Web.Mvc; 
    using System.Web.Routing; 

    public class MembershipRegistration : PortableAreaRegistration 
    { 
     public override void RegisterArea(System.Web.Mvc.AreaRegistrationContext context, IApplicationBus bus) 
     { 
      // GET /MembershipArea/GetAllUsers 
      context.MapHttpRoute("MembershipApi", 
       AreaName + "/{controller}/{id}", 
       new { area=AreaName, controller = "GetAllUsers", id = RouteParameter.Optional }); 
     } 

     public override string AreaName 
     { 
      get { return "MembershipArea"; } 
     } 
    } 
} 
19

Поддерживающие области в веб-API URL-

Вы просто должны зарегистрируйте маршрут веб-API.

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

Когда вы используете области, вы должны принять во внимание, что регистрация для маршрутов областей обычно выполняется до регистрации маршрутов без зоны. Я.е, в Global.asax Application_Start у вас есть эти строки кода, в следующем порядке:

AreaRegistration.RegisterAllAreas(); 
// ... 
RouteConfig.RegisterRoutes(RouteTable.Routes); 

Первый вызов метода будет вызывать RegisterArea метод каждый нашел xxxAreaRegistration класс. И, в этой конфигурации вы, как правило, что-то вроде этого:

context.MapRoute(
    "AreaName_default", 
    "AreaName/{controller}/{action}/{id}", 
    new { action = "Index", id = UrlParameter.Optional } 
); 

Если вы хотите иметь контроллеры Web API в этой области, необходимо добавить маршрут Web API перед этим, как так:

context.Routes.MapHttpRoute("AreaName_WebApiRoute", 
    "AreaName/Api/{controller}/{id}", 
    new { id = RouteParameter.Optional }); 

В этом случае я предполагаю, что вы хотите вызывать свои контроллеры API с помощью URL-адреса, например: /AreaName/Api/ControllerName/Id.

Обычно я храню контроллеры Web API внутри папки Api внутри папки области, но неважно, где вы их помещаете. Учтите, что контроллеры API будут найдены везде, где бы они ни находились, и если вы используете одно и то же имя для них в разных областях, вы получите конфликты: они найдены по имени класса, а не по полному (именному) имя.

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

Поддержка маршрутные пространств имен

Что делать, если вы хотите иметь контроллеры Web API с тем же именем в разных областях? Если вы действительно хотите оказать реальную поддержку областям веб-API-контроллерам, вам необходимо реализовать и зарегистрировать пользовательский номер IHttpControllerSelector.

У вас есть хорошее объяснение, и пример реализации здесь: ASP.NET Web API: Using Namespaces to Version Web APIs

Этот пример использует пространство имен для управления версиями, но код может быть несколько модифицирована для поддержки площади пространств имен.

Смежные вопросы