c# - 用于 API 版本控制的 Web API 2 属性路由

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

我有一个使用基于约定的路由的 ASP.NET Web API 2 应用程序:

[app-url]/v1/[controller]

现在,我想给 API 添加另一个版本,发现属性路由是实现我想要的最简单的方法。因此,我在 Application_Start() 方法中注册了 Web API 路由,如下所示。

GlobalConfiguration.Configure(WebApiConfig.Register);

此外,我确保 WebApiConfig 类中的 Register() 方法仅包含以下行:

config.MapHttpAttributeRoutes();

有两个 Controller 来测试版本控制:

/v1/StatusController.cs

[RoutePrefix("v1/status")]
public class StatusController : ApiController
{
    [Route("")]
    public string Get()
    {
        return "V1 - OK";
    }
}

/v2/StatusController.cs

[RoutePrefix("v2/status")]
public class StatusController : ApiController
{
    [Route("")]
    public string Get()
    {
        return "V2 - OK";
    }
}

但是,当我导航到下面显示的任一路线时,我收到错误消息。

  1. [app-url]/v1/status
  2. [app-url]/v2/status

SERVER ERROR

404 - File or directory not found.

The resource you are looking for might have been removed, had its name changed, or is temporarily unavailable.

最佳答案

您的方法将不起作用,因为 ASP.NET Web API 使用所谓的 Controller Selector 来为给定路由查找相应的 Controller 。然而,这个选择器不考虑 Controller 的命名空间,而是使用它的名称。

默认情况下,Web API 附带 DefaultHttpControllerSelector您可以找到有关其实现的信息 here .

您的问题的可能解决方案是实现自定义 IHttpControllerSelector 并告诉 Web API 使用它。为此,您可以在互联网上找到几个示例。

相反,您也可以将 Controller 名称更改为唯一的,例如:

  • StatusV1Controller
  • StatusV2Controller

关于c# - 用于 API 版本控制的 Web API 2 属性路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54668419/

相关文章:

c# - 无法在 POST 上绑定(bind) MVC 模型

c# - 将本地数据库放在 Visual Studio 解决方案中的什么位置?

asp.net - 在 SQL SERVER 中使用一个查询更新多个表

c# - 如何抑制在 razor View 中添加 "await"的编译器警告?

asp.net - 定义了重复的 'system.web.extensions/scripting/scriptResourceHandler' 部分

.net - 在 Linux 上运行 Web Api 2(mono/xsp4?)

c# - Xamarin 表单 HTTPClient 调用崩溃

c# - 通用输出目录、Web 应用程序和 IIS Express

c# - GetInterface 始终返回 null

c# - Enumerable.Unit() 函数