【发布时间】:2023-03-16 03:00:01
【问题描述】:
我正在尝试将我的 ASP.NET Core 路由的控制器限制到某个命名空间。
在以前版本的 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()定义的路由进行了funk?
更新 2
更多详情:
我有两个完全独立的 Web API 项目。顺便说一句,两者中的一些路线是相同的(即~/api/ping)。这些项目在Production中是独立的,一个是用户的端点,一个是管理员的端点。
我也有单元测试,使用Microsoft.AspNet.TestHost。其中一些单元测试需要这两个 Web API 项目的功能(即需要“admin”端点来为“user”完全设置测试用例)。但是当我引用这两个 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()
【问题讨论】:
-
“多个匹配路由” - 你能把堆栈跟踪的完整错误放在这里吗?
-
好的,请看我更新的问题。
标签: c# asp.net asp.net-core-mvc