我正在将我的项目与另一个项目集成
Multiple types were found that match the controller named 'XXXXX'.
This can happen if the route that services this request ('api/{controller}/{action}/{id}') found multiple controllers defined with the same name but differing namespaces, which is not supported.
The request for 'XXXXX' has found the following matching controllers:
COM.example.host.XXXXXController
COM.example.parasite.XXXXXController
有没有办法以任何方式使用最少量的编辑以某种方式工作?
我想避免对我的所有控制器进行修改。
谢谢
答案 0 :(得分:5)
不幸的是,这并不是很简单,因为当选择控制器来处理请求时,默认控制器选择器(DefaultHttpControllerSelector)不会在完整控制器名称中查找命名空间。
因此,您的问题至少有两种可能的解决方案:
IHttpControllerSelector
,将控制器类型命名空间考虑在内。可以找到样本here。TL; DR 默认控制器选择器使用控制器类型(HttpControllerTypeCache)的缓存,其中包含以下内容:
{
"Customers" : [
typeof(Foo.CustomersController),
typeof(Bar.CustomersController)
],
"Orders" : [
typeof(Foo.OrdersController)
]
}
因此它使用控制器名称作为字典键,但它可以包含几个具有相同控制器名称部分的类型。收到请求后,控制器选择器从路径数据中获取控制器名称。例如。如果您指定了"api/{controller}/{id}"
的默认路由,则请求api/customers/5
会将 controller 值映射到"customers"
。然后,控制器选择器获取为此名称注册的控制器类型:
NotFound
例外AmbiguousControllerException
例外(您的情况)所以..另一个命名路由的定义对你没有帮助,因为你只能在那里提供控制器名称。您无法指定名称空间。
即使您将使用Attribute Routing并为其中一个控制器操作指定另一个路径
[RoutePrefix("api/customers2")]
public class CustomersController : ApiController
{
[Route("")]
public IHttpActionResult Get()
//...
}
您仍然会遇到控制器选择器问题,因为属性路由应用于操作 - 这些请求的路由数据中没有 controller 值。归属路由的处理方式不同 - 它们被处理为"MS_attributerouteWebApi"
路由的子路由。
答案 1 :(得分:-1)
最简单的方法可能是为您的网络API添加基于操作的路由:
RouteTable.Routes.MapRoute(
"WithActionApi",
"api/{controller}/{action}/{id}"
);
对于您的WebApiConfig.cs,请务必将其置于默认规则之上。然后,通过包含方法名称来更改调用控制器的方式,此时应该或应该使方法名称唯一。