【问题标题】:VersionedRoute Attribute Implementation for MVC6MVC6 的 VersionedRoute 属性实现
【发布时间】:2015-12-29 19:14:09
【问题描述】:

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

根据this tutorial我只需要创建

VersionConstraint : IHttpRouteConstraint

VersionedRoute: RouteFactoryAttribute

用法是将[VersionedRoute("api/controllerName", 2)] 属性应用于为特定版本(例如本例中的版本 2)设计的控制器。

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

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

如果有人可以提供使用 MVC 6 的示例,或者至少提及我需要继承的正确类(理想情况下带有命名空间)?

【问题讨论】:

  • 谢谢,我已经看过那段代码了,它看起来太多了。查看旧示例,应该有更紧凑的方法来做到这一点。
  • 由于这是一个新框架,api之间可能没有一对一的映射关系。当然,您可以尝试了解新 api 是否有更简单的方法。
  • @Bilo_ZA 你能找到解决办法吗?
  • 我已经更新了我的解决方案,我认为它符合要求。

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


【解决方案1】:

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

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

一旦你有了这个,我们将把 VersionRangeValidatorGetVersion 方法更改为以下内容:

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

    return "1";
}

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

这是在控制器上使用它的方法(或者它可以是具有 2 个操作的相同控制器:

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

【讨论】:

  • 在您的示例中,您提到同一个控制器对于不同的版本可以有 2 个操作。我对此进行了测试,它运行良好,但如果 api-version 不匹配任何内容,例如:api-version: 3,路由将找到一个不明确的路由,因为有 2 个具有相同签名的 HttpGet 操作,它会抛出错误:AmbiguousActionException: Multiple actions matched. The following actions matched route data and had all constraints satisfied。关于如何处理这种情况的任何建议?参数Order 对设置首选操作没有任何影响。谢谢
  • 您必须修改示例中给出的代码,但对我来说,这将始终提供默认处理程序。遗憾的是,我还没有尝试过这种情况,在 2016 年之前我将无法给你答案。我目前没有在这台机器上安装 VS2015。 :(
  • 如果我的回答与您的原始问题相符,请花点时间将其标记为已回答。 :)
  • 这是有效的答案。不幸的是,我不是创建问题的用户,所以我无法将其标记为已回答;)
  • 哈哈圣诞疯狂
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-19
  • 2018-12-14
  • 1970-01-01
相关资源
最近更新 更多