我刚刚开始进入WebApi,我想要了解的是,您是否可以拥有一个处理多个版本的控制器。
因此,与v1/v2文件夹不同,v2在v1中有控制器的副本,但是v2中的逻辑与v1不同
你能有一个控制器来处理所有的api版本吗?
我在控制器上看到了对[APiVersion(...)]属性的引用,但是当我试图实现我认为正确的东西时,什么都不会被调用。
示例:
[ApiVersion("1.0")]
[ApiVersion("2.0")]
[Route("api/v{version:apiVersion}/login")]
public class LoginController : ApiController
{
[HttpGet]
[MapToApiVersion("1.0")]
[Route("login/{username}/{password}")]
[ResponseType(typeof(LoginResult))]
public LoginResult GetLoginInfo(string username, string password)
{
//v1 logic
}
[HttpGet]
[MapToApiVersion("2.0")]
[Route("login/{username}/{password}")]
[ResponseType(typeof(LoginResult))]
public LoginResult GetLoginInfo2(string username, string password)
{
//v2 logic
}
}我使用这个answer作为参考,但它似乎不起作用。用行动来解决这个问题吗?
理想情况下,我只希望能够在调用它的任何地方更改版本号,而不是更改操作名,但我不知道这是否可能
发布于 2017-05-27 01:55:37
一种方法可以是通过将版本直接放置在单个控制器的路由中来确保路由不发生冲突。
public class LoginController : ApiController {
[HttpGet]
[Route("~/api/v1/login/{username}/{password}")]
[ResponseType(typeof(LoginResult))]
public LoginResult GetLoginInfo(string username, string password) {
//v1 logic
}
[HttpGet]
[Route("~/api/v2/login/{username}/{password}")]
[ResponseType(typeof(LoginResult))]
public LoginResult GetLoginInfo2(string username, string password) {
//v2 logic
}
} 现在,如果添加了一个新版本,只需在路由中包含该版本号。
[HttpGet]
[Route("~/api/v3/login/{username}/{password}")]
[ResponseType(typeof(LoginResult))]
public LoginResult GetLoginInfo3(string username, string password) {
//v3 logic
}保持简单..。
https://stackoverflow.com/questions/44208399
复制相似问题