MVC & WebAPI“找到多个类型匹配名为...的控制器”

Posted

技术标签:

【中文标题】MVC & WebAPI“找到多个类型匹配名为...的控制器”【英文标题】:MVC & WebAPI "Multiple types were found that match the controller named..." 【发布时间】: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 你解决了吗?也面临同样的问题 【参考方案1】:

如果您更改了项目名称,则必须删除bin文件夹中旧项目名称的文件。

【讨论】:

欢迎来到 SO!这是评论而不是答案,等待赢得更多声誉再做。无论如何,OP 没有提到任何项目名称更改...

以上是关于MVC & WebAPI“找到多个类型匹配名为...的控制器”的主要内容,如果未能解决你的问题,请参考以下文章

Sitecore 7.5 的 MVC 检测和 WebApi 属性路由

为网站和移动应用程序混合 MVC 5 + WEB API 2 身份验证

同一解决方案中的 MVC 和 Web Api 项目

.net中MVC web项目和webapi有什么区别?

OWIN Katana、Webapi、MVC 都在单独的项目中

mvc webapi怎么允许外部html访问