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?