我有一个使用基于约定的路由的 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";
}
}
但是,当我导航到下面显示的任一路线时,我收到错误消息。
- [app-url]/v1/status
- [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/