Контроллеры разделены по областям

Возможный дубликат:
Как зарегистрировать контроллер, созданный в AREA.

У меня вопрос: можно ли сделать следующее?

У меня есть три области:

_Default
SiteOne
SiteTwo

Внутри каждой области у меня есть ApiController с тем же именем, но в разных пространствах имен:

MvcAppliaction.Areas._Default.Controllers.ValuesController
MvcAppliaction.Areas.SiteOne.Controllers.ValuesController
MvcAppliaction.Areas.SiteTwo.Controllers.ValuesController

У меня также есть значение тока (которое я бы хотел использовать) Area in configuration.

Я хотел бы сопоставить пользователя с контроллером в соответствующей области (которую я могу найти в конфигурации), если он входит в браузер:

/api/values

Например, если текущая Area в файле конфигурации - SiteOne, тогда этот запрос должен быть сопоставлен с контроллером MvcAppliaction.Areas.SiteOne.Controllers.ValuesController, но если я изменю текущую область в файле конфигурации на SiteTwo _Default, она должна быть сопоставлена ​​с правильный контроллер.

PS. С контроллером MVC это просто, вам просто нужно установить свой маршрут:

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
    namespaces: new[] { "MvcApplication.Web.Areas." + SiteName + ".Controllers") }
);

Ответ 1

Мое предложение - реализовать пользовательский DefaultControllerFactory.

Вы можете увидеть очень хороший пример здесь

Контроллер по умолчанию factory просто перечисляет все контроллеры по имени в списке, не допускающем такого рода функциональность. В приведенной выше статье показано, как создать новый factory и получить контроль над созданием контроллера, позволяя легко сопоставлять маршруты с определенным пространством имен.

Это даст функциональность, которую вы ищете.

Ответ 2

Попробуйте добавить следующий оператор using и измените регистрацию маршрута в файле AreaRegistration.cs.

using System.Web.Http;
...
public override void RegisterArea(AreaRegistrationContext context)
{
        context.Routes.MapHttpRoute(
            name: this.AreaName,
            routeTemplate: this.AreaName + "/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
}