Warum kann auf meine bereichsspezifischen Web-APIs in allen anderen Bereichen zugegriffen werden?

Ich arbeite derzeit an einem ASP.NET MVC 4-Webanwendungsprojekt, das die folgenden Entwurfsentscheidungen einhalten muss:

Die Hauptanwendung von MVC befindet sich im Stammverzeichnis der Lösung.Alle Administratorfunktionen befinden sich in einem separaten Bereich.Jede externe Partei (z. B. Lieferanten) hat ihren eigenen Bereich.Jeder Bereich, einschließlich der Wurzel, bildet einen gut getrennten Funktionsblock. Funktionen aus einem Bereich dürfen keinem anderen Bereich ausgesetzt werden. Dies soll den unbefugten Zugriff auf Daten verhindern.Jeder Bereich, einschließlich des Stamms, verfügt über eine eigene RESTfull-API (Web-API).

Alle normalen Controller in allen Bereichen, einschließlich Root, funktionieren wie erwartet. Einige meiner Web-API-Controller zeigen jedoch ein unerwartetes Verhalten. Wenn beispielsweise zwei Web-API-Controller mit demselben Namen, jedoch in unterschiedlichen Bereichen, vorhanden sind, tritt die folgende Ausnahme auf:

Es wurden mehrere Typen gefunden, die dem Controller mit dem Namen "Clients" entsprechen. Dies kann passieren, wenn die Route, die diese Anforderung bedient ("api / {controller} / {id}"), mehrere Controller mit demselben Namen, aber unterschiedlichen Namespaces gefunden hat. Dies wird nicht unterstützt.

Die Anforderung für "Clients" hat die folgenden übereinstimmenden Controller gefunden: MvcApplication.Areas.Administration.Controllers.Api.ClientsController MvcApplication.Controllers.Api.ClientsController

Dies scheint seltsam, da ich unterschiedliche Routen habe, die beide trennen sollten. Hier ist meine AreaRegistration für den Bereich Administration:

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 }
        );
    }
}

Außerdem stelle ich fest, dass ich auf bereichsspezifische Web-APIs zugreifen kann, ohne den Namen des Bereichs aus dem Aufruf zu entfernen.

Was geht hier vor sich? Wie bringe ich meine Web-API-Controller dazu, sich wie normale ASP.NET MVC-Controller zu verhalten?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage