.net - MVC6 的 VersionedRoute 属性实现

标签 .net asp.net-web-api asp.net-core asp.net-core-mvc api-versioning

我正在尝试在 REST API 上启用版本控制,其中版本在 header 中指定,如 "api-version":2 .

根据this tutorial我只需要创建

VersionConstraint : IHttpRouteConstraint

VersionedRoute: RouteFactoryAttribute

用法是应用 [VersionedRoute("api/controllerName", 2)] Controller 的属性,它们是为特定版本设计的(例如本例中的版本 2)。

这一切都很好,但不幸的是,这一切都在 MVC5 中,而我正在使用 MVC6。因此,RouteFactoryAttributeIHttpRouteConstraint不工作。

我设法找到IRouteConstraint替换IHttpRouteConstraint (希望它能起作用),但我找不到 RouteFactoryAttribute 的替代品.

是否有人可以提供使用 MVC 6 的示例,或者至少提及我需要继承的正确类(最好带有命名空间)?

最佳答案

这是您需要的最少工作量。

首先,去there并复制以下 3 个文件的代码:

一旦获得此信息,我们将更改 VersionRangeValidatorGetVersion 方法,如下所示:

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

    return "1";
}

这将读取 header 并返回 API 版本。在这种情况下,默认值为 v1

以下是如何在 Controller 上使用它(或者它可以是具有 2 个操作的相同 Controller :

[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);
            });
});

关于.net - MVC6 的 VersionedRoute 属性实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32892557/

相关文章:

asp.net-mvc - 操作被取消。在 System.Threading.CancellationToken.ThrowIfCancellationRequested()

c# - 在 Blazor 应用程序中自动注入(inject) JavaScript

c# - 传递给 HttpContext.SignInAsync 和 CookieAuthenticationOptions.ExpireTimeSpan 的时间之间的差异

c# - 我可以将一个类标记为不是我的代码以便调试器跳过它吗?

c# - 为什么我不能只使用 EventHandler<int> 而不是从 EventArgs 派生

.net - NHibernate 使用 QueryOver : WHERE and EXISTS

.net - ASP.NET Core Minimal API 必须以正斜杠开头吗?

c# - 使用 WebClient 对网站执行 ping 操作

asp.net - 如何在自定义 WebAPI HttpMessageHandler 中安全地设置用户主体?

c# - Angular 没有从.net core获取异常消息