Реализация атрибута VersionedRoute для MVC6

Я пытаюсь включить управление версиями в REST API, где версия указана в заголовке, как "api-version":2.

Согласно этому учебнику мне просто нужно создать

VersionConstraint : IHttpRouteConstraint

и

VersionedRoute: RouteFactoryAttribute

Использование будет заключаться в применении атрибута [VersionedRoute("api/controllerName", 2)] Attribute to Controllers, которые предназначены для определенных версий (например, версия 2 в этом случае).

Это все хорошо и хорошо, но, к сожалению, все это в MVC5, и я использую MVC6. Поэтому RouteFactoryAttribute и IHttpRouteConstraint не работают.

Мне удалось найти IRouteConstraint для замены IHttpRouteConstraint (надеюсь, что он будет работать), но я не могу найти замену для RouteFactoryAttribute.

Если кто-то может предоставить образец этого с помощью MVC 6 или, по крайней мере, упомянуть правильные классы (в идеале с пространствами имен), мне нужно наследовать от?

Ответы

Ответ 1

Здесь минимальный объем работы, который вам нужен.

Сначала перейдите там и скопируйте код для следующих трех файлов:

После этого мы изменим метод GetVersion VersionRangeValidator для следующего:

public static string GetVersion(HttpRequest request)
{
    if (!string.IsNullOrWhiteSpace(request.Headers["api-version"]))
        return request.Headers["api-version"];

    return "1";
}

Это будет читать заголовок и возвращать версию API. По умолчанию в этом сценарии будет v1.

Здесь, как использовать его на контроллерах (или это могут быть те же контроллеры с двумя действиями:

[Route("api/data")]
public class DataController 
{
    [VersionGet("", versionRange: "[1]")]
    public string GetData()
    {
        return "v1 data";
    }
}

[Route("api/data")]
public class DataV2Controller 
{
    [VersionGet("", versionRange: "[2]")]
    public string GetData()
    {
        return "v2 data";
    }
}

Итак, теперь вам просто нужно дать ему правильный заголовок, и это хорошо. Этот код был протестирован с помощью jQuery следующим образом:

$(document).ready(function(){
    $.ajax({url: '/api/Data/', headers: { 'api-version': 1 }})
    .then(function(data){
            alert(data);
            });
    $.ajax({url: '/api/Data/', headers: { 'api-version': 2 }})
    .then(function(data){
            alert(data);
            });
});