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

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

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

VersionConstraint : IHttpRouteConstraint

а также

VersionedRoute: RouteFactoryAttribute

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

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

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

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

1 ответ

Решение

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

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

  • VersionGetAttribute
  • VersionRangeValidator
  • VersionRoute.cs

Как только вы это сделаете, мы изменим 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);
            });
});
Другие вопросы по тегам