gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:07:17 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com