我有一个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";
}
}
但是,当我导航到下面显示的任一路线时,我收到错误。
服务器错误
404 - 找不到文件或目录。
您要查找的资源可能已被删除,名称已更改或暂时不可用。
您的方法将无法工作,因为ASP.NET Web API使用所谓的Controller Selector
来查找给定路由的相应控制器。但是,此选择器不考虑控制器的名称空间,而是使用其名称。
默认情况下,Web API附带DefaultHttpControllerSelector,您可以找到有关其实现here的信息。
您的问题的一个可能的解决方案是实现自定义IHttpControllerSelector
并告诉Web API使用它。为此,您可以在互联网上找到几个例子。
相反,您也可以将控制器名称更改为唯一,例如:
StatusV1Controller
StatusV2Controller
不使用不同的命名空间,而是使用不同的控制器名称(如果这适用于您)。如果是这样,这里是关于代码应该如何:
/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
希望这建议替代帮助。祝好运。