[英]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
类中的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";
}
}
但是,当我导航到下面显示的任一路线时,我收到错误。
服务器错误
404 - 找不到文件或目录。
您要查找的资源可能已被删除,名称已更改或暂时不可用。
您的方法将无法工作,因为ASP.NET Web API使用所谓的Controller Selector
来查找给定路由的相应控制器。 但是,此选择器不考虑控制器的名称空间,而是使用其名称。
默认情况下,Web API附带DefaultHttpControllerSelector ,您可以在此处找到有关其实现的信息 。
您的问题的一个可能的解决方案是实现自定义IHttpControllerSelector
并告诉Web API使用它。 为此,您可以在互联网上找到几个例子。
相反,您也可以将控制器名称更改为唯一,例如:
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方法调用这两个不同的版本,如:
Https://YourUrl.com/v1/status
和:
Https://YourUrl.com/v2/status
希望这建议替代帮助。 祝好运。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.