Я пытаюсь ограничить контроллеры моих основных маршрутов ASP.NET определенным пространством имен.
В предыдущих версиях ASP.NET MVC произошла перегрузка, которая предоставляла параметр string[] namespaces
при добавлении маршрутов. Это отсутствует в ASP.NET MVC 6. Итак, после некоторых поисковых запросов я попытался сыграть с чем-то вроде
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
Подробнее:
У меня есть два полностью независимых проекта Web API. Кстати, несколько маршрутов одинаковы в обоих (т.е. ~/api/ping
). Эти проекты независимы в Production, одна из них - конечная точка для пользователей, одна из которых является конечной точкой для администраторов.
У меня также есть модульные тесты, используя Microsoft.AspNet.TestHost
. Некоторые из этих модульных тестов требуют функциональности обоих этих проектов Web 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()