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

时间:2017-06-16 14:54:46

标签: 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

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

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

谢谢

2 个答案:

答案 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"。然后,控制器选择器获取为此名称注册的控制器类型:

  • 如果有1种类型,那么我们可以实例化它并处理请求
  • 如果有0种类型,则会抛出NotFound例外
  • 如果有2种或更多类型,则会抛出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,请务必将其置于默认规则之上。然后,通过包含方法名称来更改调用控制器的方式,此时应该或应该使方法名称唯一。