3

在我的 ASP.NET Core 项目中,我正在使用aspnet-api-versioning,如下所示:

[ApiVersion("1.0")]
[Route("api/v{version:apiVersion}/users")]
[Authorize]
public class UserController : Controller
{

  [HttpGet, MapToApiVersion("1.0")]
  public async Task<IActionResult> GetUsers([FromQuery] string searchString, [FromQuery] bool allOrganizations = false)
  {
   ...
  }

}    

所以请求被发送到:GET /api/v1/users.

添加此操作的另一个版本时,我只需添加属性MapToApiVersion("2.0"),这样它就是GET /api/v2/users. 没关系。

然而,在一个视图中,我用 ajax 调用这个动作,如下所示:

$.ajax({
url: '@Url.Action("GetUsers", "User", new{version = 1})' + "?searchString=" + $("#user-search").val() + "&allOrganizations=true",
type: "GET",
success: function(data) {
response($.map(data,
function(obj) {
return {
        //some mapping
       };
 }));
}
});

这将调用端点:/User/GetUsers?version=1?searchString={searchString}&allOrganizations=true

因此它将版本附加为查询参数而不是路由参数。

如果我不添加 new {version = 1}它只是没有“版本”查询参数是一样的。

我也尝试过使用@Url.RouteUrl("Get_Users", new {version =1})和命名操作,[HttpGet("Get_Users"), MapToApiVersion("1.0")]但这只是将查询参数附加到当前 url。

但是,如果我将Controllers路由属性从[Route("api/v{version:apiVersion}/users")]to更改[Route("api/users")]并省略 version 参数,则 ajax 调用可以正常工作。

那么IUrlHelper除了硬编码url字符串之外,还有什么方法可以使用(或其他方式)来获得版本化操作的正确路径?还是我在某种程度上做错了版本控制?

我可能只是在这里复杂化了,但我仍然认为这应该有效,不是吗?

4

3 回答 3

2

(让我烦恼的)解决方案是将确切的 APIversion值作为字符串值传递,而不是像您所做的那样传递整数。因此,在您的剃刀片段中,IUrlHelper应该像这样调用实例:

url: '@Url.Action("GetUsers", "User", new { version = "1.0" })' ...

请注意,版本明确是 1.0,它正确(就 MAJOR.MINOR 等语法而言)与您在属性中指定的版本(如[ApiVersion("1.0")].

于 2019-05-06T19:05:04.503 回答
2

我很欣赏这个答案不是 .net 核心特定的,可能无法回答您的问题,但考虑使用控制器名称中的版本创建 api 控制器

例如,V1Controller、V2Controller 等 Urls /api/v1/GetUsers、/api/v2/GetUsers 处理版本控制并保持版本之间的代码谨慎并减少任何方法名称冲突。

于 2017-01-18T05:51:32.760 回答
1

不幸的是,IUrlHelper不支持 API 版本。我建议您使用版本化名称(例如 )命名您需要解析的路由[HttpGet(Name = "GetUsersV1")],然后使用Url.Link( "GetByUsersV1", new { version = 1 } ).

于 2018-03-26T03:04:21.047 回答