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

问题描述 投票:3回答:2

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

[app-url]/v1/[controller]

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

GlobalConfiguration.Configure(WebApiConfig.Register);

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

config.MapHttpAttributeRoutes();

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

/V1/status controller.此时

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

/V2/status controller.此时

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

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

  1. [应用网址] / V1 /状态
  2. [应用网址] / V2 /状态

服务器错误

404 - 找不到文件或目录。

您要查找的资源可能已被删除,名称已更改或暂时不可用。

c# asp.net asp.net-web-api2 asp.net-routing
2个回答
2
投票

您的方法将无法工作,因为ASP.NET Web API使用所谓的Controller Selector来查找给定路由的相应控制器。但是,此选择器不考虑控制器的名称空间,而是使用其名称。

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

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

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

  • StatusV1Controller
  • StatusV2Controller

2
投票

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

/V1/status controller.此时:

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

/V2/status controller.此时:

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

现在,您可以通过调用Http Get方法调用这两个不同的版本,如:

Https://YourUrl.com/v1/status

和:

Https://YourUrl.com/v2/status

希望这建议替代帮助。祝好运。

© www.soinside.com 2019 - 2024. All rights reserved.