具有相同名称的 Controller 的 asp.net Web api 路由

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

有没有办法让它以某种方式以最少的双方编辑量工作?

我希望避免对我的所有 Controller 进行修改。

谢谢

最佳答案

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

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

  • 编写您自己的IHttpControllerSelector,它将 Controller 类型命名空间考虑在内。 sample 可见here .
  • 重命名一种 Controller 类型以使其唯一。

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

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

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

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

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

即使您使用 Attribute Routing并为其中一个 Controller 操作指定另一条路线

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

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

关于具有相同名称的 Controller 的 asp.net Web api 路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44592311/

相关文章:

asp.net - 如何在我的 ASP.NET 项目中使用 JavaScript 文件?

c# - 对于多个Azure表存储帐户实现,如何实现每秒超过20,000+请求的插入和查询?

asp.net - Visual Studio 2013 ASP.NET 项目中 Antlr 包的用途是什么?

asp.net-web-api - 资源所有者凭据与 JavaScript 和 IdentityServer 一起流动 - 不允许吗?

asp.net-web-api - 错误请求 - 无效的 URL web api

asp.net - gridview的item如何排列?

c# - 获取网站的 URL

reactjs - DELETE 时发生 CORS 错误

performance - 记录 ASP Web API 操作的持续时间

c# - 添加新的 OData Controller 会使现有 Controller 失败