gpt4 book ai didi

c# - 具有路由属性的模糊 Controller 名称 : controllers with same name and different namespace for versioning

转载 作者:可可西里 更新时间:2023-11-01 07:43:03 26 4
gpt4 key购买 nike

我正在尝试添加 API 版本控制,我的计划是为不同命名空间中的每个版本创建一个 Controller 。我的项目结构是这样的(注意:每个版本没有单独的区域)

Controllers
|
|---Version0
| |
| |----- ProjectController.cs
| |----- HomeController.cs
|
|---Version1
|
|----- ProjectController.cs
|----- HomeController.cs

我正在为路由使用 RoutingAttribute。因此,Version0 中的 ProjectController 具有路由功能

namespace MyProject.Controllers.Version0
{
class ProjectController : BaseController
{
...

[Route(api/users/project/getProjects/{projectId})]
public async GetProjects(string projectId)
{
...
}
}
}

并且 Version1 中的 ProjectController 具有路由功能

namespace MyProject.Controllers.Version1
{
class ProjectController : BaseController
{
...

[Route(api/v1/users/project/getProjects/{projectId})]
public async GetProjects(string projectId)
{
...
}
}
}

但是,当我尝试访问该服务时,我得到了 404-NotFound。

如果我将 Controller 重命名为具有唯一名称(Project1Controller 和 Project2Controller),则路由有效。但是,为了简单起见,我试图避免重命名。

我点击此链接来解决问题,但没有帮助。我确实创建了区域,但仍然没有成功。在 global.aspx 文件中添加路由逻辑没有帮助。命名空间也不起作用。 http://haacked.com/archive/2010/01/12/ambiguous-controller-names.aspx/

上面的链接建议创建区域,但是属性路由不支持按链接创建区域: http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

还有其他解决方案吗? RoutingAttributes 的错误?

谢谢!

最佳答案

首先,Web API 路由和 MVC 路由的工作方式并不完全相同。

您的第一个链接指向带有区域的 MVC 路由。 Web API 未正式支持区域,但您可以尝试制作与它们类似的东西。然而,即使您尝试执行类似的操作,您也会遇到相同的错误,因为 Web API 查找 Controller 的方式没有考虑 Controller 的命名空间。

所以,开箱即用,它永远不会工作。

但是,您可以修改大多数 Web API 行为,这也不异常(exception)。

Web API 使用 Controller 选择器来获取所需的 Controller 。上面解释的行为是 DefaultHttpControllerSelector 的行为,随 Web API 一起提供,但您可以实现自己的选择器来替换默认选择器,并支持新行为。

如果您在 google 上搜索“custom web api controller selector”,您会发现很多示例,但我发现这个最适合您的问题:

这个实现也很有趣:

如您所见,基本上您需要:

  • 实现您自己的 IHttpControllerSelector,它考虑命名空间以查找 Controller ,并考虑命名空间路由变量以选择其中之一。
  • 通过 Web API 配置用这个替换原来的选择器。

关于c# - 具有路由属性的模糊 Controller 名称 : controllers with same name and different namespace for versioning,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27933731/

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