Web API 2 API 版本控制的属性路由

Web API 2 Attribute Routing for API Versioning

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

[app-url]/v1/[controller]

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

GlobalConfiguration.Configure(WebApiConfig.Register);

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

config.MapHttpAttributeRoutes();

有两个控制器可以测试版本控制:

/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 来查找给定路线的相应控制器。但是,此选择器不考虑控制器的名称空间,而是使用它的名称。

默认情况下,Web API 附带 DefaultHttpControllerSelector and you can find information on its implementation here

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

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

  • StatusV1Controller
  • StatusV2Controller

不要使用不同的命名空间,而是使用不同的控制器名称(如果这适合您)。如果是这样,代码应该是这样的:

/v1/StatusController.cs:

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

/v2/StatusController.cs:

[System.Web.Http.RoutePrefix("v2/status")]
public class Status2Controller : ApiController
{
    [System.Web.Http.Route("")]
    public string Get()
    {
        return "V2 - OK";
    }
 }

现在您可以通过像这样调用 Http Get 方法来调用这 2 个不同的版本:

Https://YourUrl.com/v1/status

和:

Https://YourUrl.com/v2/status

希望这个建议的替代方案有所帮助。祝你好运。