Реализация атрибута 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);
});
});