Подтвердить что ты не робот

Поддержка ASP.Net WebAPI

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

Когда вы используете области, вы должны принять во внимание, что регистрация для маршрутов областей обычно выполняется до регистрации маршрутов неземной зоны. I.e, в 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 }
);

Если вы хотите иметь контроллеры веб-API внутри этой области, вы должны добавить маршрут веб-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: использование пространств имен в веб-интерфейсах версии

В этом примере используются пространства имен для управления версиями, но код может быть слегка изменен для поддержки пространств имен.

Ответ 3

ASP.NET MVC 4 не поддерживает WebAPI в областях.

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

Я успешно протестировал это решение с портативными областями (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"; }
        }
    }
}

Ответ 4

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