繁体   English   中英

同名控制器的asp.net Web API路由

[英]asp.net web api route for controllers with same name

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

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

有没有一种方法可以使这种方式以最少的修改量起作用?

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

谢谢

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

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

  • 编写自己的IHttpControllerSelector ,它将控制器类型的名称空间考虑在内。 样本可以在这里找到。
  • 重命名一种控制器类型以使其唯一。

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

{
   "Customers" : [
        typeof(Foo.CustomersController),
        typeof(Bar.CustomersController)        
   ],
   "Orders" : [
       typeof(Foo.OrdersController)
   ]
}

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

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

因此,..另一个命名路由的定义将无济于事,因为您只能在此处提供控制器名称。 您不能指定名称空间。

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

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

您仍将面临控制器选择器问题,因为属性路由已应用于操作-路由数据中对于这些请求将没有控制器值。 属性路由的处理方式有所不同-将它们作为"MS_attributerouteWebApi"路由的子路由进行处理。

最简单的方法是将基于操作的路由添加到Web api:

RouteTable.Routes.MapRoute(
     "WithActionApi",
     "api/{controller}/{action}/{id}"
 );

对于您的WebApiConfig.cs,请确保将其置于默认规则之上。 然后,通过包含方法名称来更改您调用控制器的方式,该名称此时应该是唯一的或应具有唯一性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM