2017-01-17 6 views
2

В моем проекте 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? Или я что-то неправильно делаю с версией?

Я могу просто усложнять здесь, но я все еще думаю, что это должно работать, нет?

ответ

1

Я ценю этот ответ не .net ядра специфичны и не может ответить вам вопрос, но рассмотреть вопрос о создании контроллеров API с версией во имя контроллера

например V1Controller, V2Controller, так что Urls/api/v1/GetUsers,/api/v2/GetUsers обрабатывает управление версиями и сохраняет код сдержанным между версиями и уменьшает конфликты имен методов.

+0

Спасибо за предложение, это имеет смысл. Я, вероятно, поеду туда, если не найду, как создать URL-адрес, используя параметр маршрута, как я сейчас делаю. –

+0

Еще одно преимущество наличия отдельных контроллеров - если у вас есть какая-то автоматическая документация, это также будет разделено контроллерами. –