【发布时间】:2019-05-13 13:54:24
【问题描述】:
我遇到了 MVC 和 WebAPI 控制器的路由问题。
错误是:
找到了多个与名为“Log”的控制器匹配的类型。这 如果服务此请求的路由可能会发生 ('api/{controller}/{action}/{id}') 发现定义了多个控制器 名称相同但命名空间不同,不支持。 对“日志”的请求找到了以下匹配的控制器: MyNamespace.Controllers.LogController MyNamespace.Controllers.WebAPI.LogController
我的路由很简单:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
我尝试为 WebAPI 添加额外的路由,例如:
routes.MapHttpRoute(
name: "API",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
为 MVC 路由添加命名空间:
namespaces: new[] { "MyNamespace.Controllers" }
但我仍然收到同样的错误。我看不到为 WebAPI 路由指定命名空间的方法。
有一个well-upvoted duplicate,但它专门针对 MVC 控制器。答案谈到了如上所述添加命名空间,这在这里没有帮助。在我的情况下,到 MVC 控制器的路由工作正常,而且只有 WebAPI 控制器有问题。
奇怪的是,我所有的其他 WebAPI 控制器都与 MVC 控制器同名,但这是我遇到错误的唯一一个。
【问题讨论】:
-
我强烈建议重命名控制器,从长远来看,它只是更安全,更容易使用。
-
@DavidG 这似乎是未来的明智选择。但我有兴趣了解为什么会发生这种情况,特别是当它只影响一个控制器而其他重复名称很好时。
-
如果在 API 路由中加入命名空间约束会怎样?喜欢
namespaces: new[] { "MyNamespace.Controllers.WebAPI" }。如果您在 MVC 级别指定 API 控制器,它们仍位于MyNamespace.Controllers的命名空间中。 -
@CraigH 除非我遗漏了什么,否则 MapHttpRoute 中的命名空间没有参数(与 MapRoute 不同)。
-
@OwenPauling 你解决了吗?也面临同样的问题
标签: c# asp.net-mvc asp.net-web-api asp.net-web-api-routing