В моем проекте ASP.NET ядра я использую aspnet-api-versioning так:Сформировать URL из версированных действий API с IUrlHelper
[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-адресу.
Однако если изменить контроллер атрибутов маршрута от [Route("api/v{version:apiVersion}/users")]
к [Route("api/users")]
и ommit параметру версии, вызов Ajax работает отлично.
Так можно ли использовать IUrlHelper
(или каким-либо другим способом), чтобы получить правильный маршрут к действию с версией, помимо жесткого кодирования строки url? Или я что-то неправильно делаю с версией?
Я могу просто усложнять здесь, но я все еще думаю, что это должно работать, нет?
Спасибо за предложение, это имеет смысл. Я, вероятно, поеду туда, если не найду, как создать URL-адрес, используя параметр маршрута, как я сейчас делаю. –
Еще одно преимущество наличия отдельных контроллеров - если у вас есть какая-то автоматическая документация, это также будет разделено контроллерами. –