Я пытаюсь ограничить контроллеры моих маршрутов ASP.NET Core определенным пространством имен.
В предыдущих версиях ASP.NET MVC была перегрузка, которая предоставляла параметр string[] namespaces
при добавлении маршрутов. Этого нет в ASP.NET MVC 6. Итак, после некоторого поиска в Google я попытался поиграть с чем-то вроде
app.UseMvc(routes => {
var dataTokens = new RouteValueDictionary {
{
"Namespaces", new[] {"ProjectA.SomeNamespace.Controllers"}
}
};
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}",
defaults: null,
constraints: null,
dataTokens: dataTokens
);
});
но, похоже, это не то, что я хочу. Есть ли способ ограничить механизм маршрутизации определенным пространством имен?
Обновить
Я только что понял, что это может быть связано с тем, что я использую маршрутизацию атрибутов на каждом отдельном контроллере? Сдерживает ли маршрутизация с атрибутами маршруты, определенные app.UseMvc()
?
Обновление 2
Подробнее:
У меня два полностью независимых проекта веб-API. Между прочим, некоторые маршруты идентичны в обоих (например, ~/api/ping
). Эти проекты независимы в производственной среде, один является конечной точкой для пользователей, другой - конечной точкой для администраторов.
У меня также есть модульные тесты, использующие Microsoft.AspNet.TestHost
. Для некоторых из этих модульных тестов требуются функциональные возможности обоих этих проектов веб-API (т. Е. Требуется конечная точка «admin» для полной настройки тестового примера для «пользователя»). Но когда я ссылаюсь на оба проекта API, TestHost запутывается из-за идентичных маршрутов и жалуется на «несколько совпадающих маршрутов»:
Microsoft.AspNet.Diagnostics.DeveloperExceptionPageMiddleware: Error: An unhandled exception has occurred while executing the request
Microsoft.AspNet.Mvc.Infrastructure.AmbiguousActionException: Multiple actions matched. The following actions matched route data and had all constraints satisfied:
ProjectA.SomeNamespace.Controllers.PingController.Ping
ProjectB.SomeNamespace.Controllers.PingController.Ping
at Microsoft.AspNet.Mvc.Infrastructure.DefaultActionSelector.SelectAsync(RouteContext context)
at Microsoft.AspNet.Mvc.Infrastructure.MvcRouteHandler.<RouteAsync>d__6.MoveNext()