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

标签 c# asp.net asp.net-web-api asp.net-web-api2 asp.net-web-api-routing

我正在尝试添加 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/

相关文章:

c# - 从代码隐藏中查找使用 Repeater 创建的标记中的控制值

asp.net-web-api - 在身份验证过滤器中的 ChallengeAsync 方法上下文中设置 Result

c# - 操作未在分配的超时 00 :01:00 内完成

c# - TextRenderer.DrawText 在 XP 和 Vista 上以不同方式呈现 Arial

c# - Microsoft Bot Framework : Typing address in Facebook messenger does not work 的 Bing 位置控制

asp.net - 我是否完全误解了 ASP.Net AJAX(更新面板)?

asp.net - ASP.net 按钮 Web 控件的 Javascript 属性

azure - 如何使用 IoC 容器让 ASPNET WebAPI 与 Azure 辅助角色上的 Microsoft.Owin.Host.HttpListener 配合使用?

c# - 保存调用栈

c# - 使用 BinaryFormatter 反序列化我的序列化数据时出现异常