Dlaczego mój internetowy interfejs API jest dostępny ze wszystkich innych obszarów?

Obecnie pracuję nad projektem aplikacji sieci Web ASP.NET MVC 4, który musi spełniać następujące decyzje projektowe:

Główna aplikacja MVC znajduje się w katalogu głównym rozwiązania.Wszystkie funkcje administratora znajdują się w oddzielnym obszarze.Każda strona zewnętrzna (np. Dostawcy) ma swój własny obszar.Każdy obszar, w tym korzeń, stanowi dobrze oddzielony blok funkcjonalny. Funkcjonalność z jednego obszaru nie może być wystawiona na inny obszar. Ma to zapobiec nieautoryzowanemu dostępowi do danych.Każdy obszar, w tym root, ma swój własny RESTfull API (Web API).

Wszystkie normalne kontrolery we wszystkich obszarach, w tym root, działają zgodnie z oczekiwaniami. Jednak niektóre z moich kontrolerów Web API wykazują nieoczekiwane zachowanie. Na przykład posiadanie dwóch kontrolerów Web API o tej samej nazwie, ale w różnych obszarach powoduje następujący wyjątek:

Znaleziono wiele typów pasujących do kontrolera o nazwie „klienci”. Może się tak zdarzyć, jeśli trasa obsługująca to żądanie („api / {controller} / {id}”) znalazła wiele kontrolerów zdefiniowanych z tą samą nazwą, ale różniących się przestrzeniami nazw, które nie są obsługiwane.

Żądanie „klientów” zawiera następujące pasujące kontrolery: MvcApplication.Areas.Administration.Controllers.Api.ClientsController MvcApplication.Controllers.Api.ClientsController

Wydaje się to dziwne, ponieważ mam różne trasy, które powinny oddzielać obie. Oto moja rejestracja w obszarze Administracja:

public class AdministrationAreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get
        {
            return "Administration";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.Routes.MapHttpRoute(
            name: "Administration_DefaultApi",
            routeTemplate: "Administration/api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

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

Ponadto zauważam, że mogę uzyskać dostęp do specyficznych dla danego obszaru interfejsów API Web, pomijając nazwę obszaru z połączenia.

Co tu się dzieje? Jak sprawić, aby moje kontrolery Web API zachowywały się tak, jak normalne kontrolery ASP.NET MVC?

questionAnswers(1)

yourAnswerToTheQuestion