用于同名控制器的asp.net web api路由

her*_*e 0 5 asp.net asp.net-web-api

我正在将我的项目与另一个项目集成

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
Run Code Online (Sandbox Code Playgroud)

有没有办法以任何方式使用最少量的编辑以某种方式工作?

我想避免对我的所有控制器进行修改.

谢谢

Ser*_*kiy 6

不幸的是,这并不是很简单,因为当选择控制器来处理请求时,默认控制器选择器(DefaultHttpControllerSelector)不会在完整控制器名称中查找命名空间.

因此,您的问题至少有两种可能的解决方案:

  • 编写自己的IHttpControllerSelector控制器类型命名空间.样品可以在这里找到.
  • 重命名其中一个控制器类型,然后使其唯一.

TL; DR默认控制器选择器使用控制器类型的缓存(HttpControllerTypeCache),其中包含以下内容:

{
   "Customers" : [
        typeof(Foo.CustomersController),
        typeof(Bar.CustomersController)        
   ],
   "Orders" : [
       typeof(Foo.OrdersController)
   ]
}
Run Code Online (Sandbox Code Playgroud)

因此它使用控制器名称作为字典键,但它可以包含几个具有相同控制器名称部分的类型.收到请求后,控制器选择器从路径数据中获取控制器名称.例如,如果您指定了默认路由,"api/{controller}/{id}"则request api/customers/5会将控制器值映射到"customers".然后,控制器选择器获取为此名称注册的控制器类型:

  • 如果有1种类型,那么我们可以实例化它并处理请求
  • 如果有0种类型,则抛出NotFound异常
  • 如果有2种或更多类型,它会抛出AmbiguousControllerException异常(你的情况)

所以..另一个命名路由的定义对你没有帮助,因为你只能在那里提供控制器名称.您无法指定命名空间.

即使您将使用属性路由并为其中一个控制器操作指定另一个路由

[RoutePrefix("api/customers2")]
public class CustomersController : ApiController
{
     [Route("")]
     public IHttpActionResult Get()
     //...
}
Run Code Online (Sandbox Code Playgroud)

您仍然会遇到控制器选择器问题,因为属性路由应用于操作 - 这些请求的路由数据中没有控制器值.归属路由的处理方式不同 - 它们作为路由的子路由处理"MS_attributerouteWebApi".