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)
有没有办法以任何方式使用最少量的编辑以某种方式工作?
我想避免对我的所有控制器进行修改.
谢谢
不幸的是,这并不是很简单,因为当选择控制器来处理请求时,默认控制器选择器(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".然后,控制器选择器获取为此名称注册的控制器类型:
NotFound异常AmbiguousControllerException异常(你的情况)所以..另一个命名路由的定义对你没有帮助,因为你只能在那里提供控制器名称.您无法指定命名空间.
即使您将使用属性路由并为其中一个控制器操作指定另一个路由
[RoutePrefix("api/customers2")]
public class CustomersController : ApiController
{
[Route("")]
public IHttpActionResult Get()
//...
}
Run Code Online (Sandbox Code Playgroud)
您仍然会遇到控制器选择器问题,因为属性路由应用于操作 - 这些请求的路由数据中没有控制器值.归属路由的处理方式不同 - 它们作为路由的子路由处理"MS_attributerouteWebApi".
| 归档时间: |
|
| 查看次数: |
3642 次 |
| 最近记录: |