【问题标题】:ASP.Net API Versioning issueASP.Net API 版本控制问题
【发布时间】:2017-07-02 11:17:07
【问题描述】:

我从事 REST MVC 项目。并调查 API 项目的版本控制。

请求被发送到一个单独的 ASP.NET MVC 项目,然后发送到另一个单独的项目,客户端代理。最后,客户端代理将请求流向 API 项目(ASP.Net Core)。

版本控制将放在 API 项目中。

我已经在我的一个 API 上实现了快速版本控制,并且工作正常。但我的做法是我的问题。我在“客户端代理”项目的请求 URL 中硬编码了实际版本 (v1.0)。我需要知道我应该在哪里指定 API 所需的版本?我的意思是它必须来自客户端(也许是javascript)。请指教。

我已经实现了路由约定,所以路由总是基于这个:

"api/v{version:apiVersion}/controller"

但我仍然不知道,如何在它到达我的客户端代理项目之前指定版本。

下面是我的路由约定类:

public class RouteConvention : IApplicationModelConvention
{
    //private readonly AttributeRouteModel _centralPrefix;

    private readonly string _versionConstraintTemplate;
    private readonly string _versionedControllerTemplate;

    public RouteConvention() //IRouteTemplateProvider routeTemplateProvider
    {
        //_centralPrefix = new AttributeRouteModel(routeTemplateProvider);

        _versionConstraintTemplate = "v{version:apiVersion}";
        _versionedControllerTemplate = $"{_versionConstraintTemplate}/[controller]";
    }   

    public void Apply(ApplicationModel application)
    {
        foreach (var applicationController in application.Controllers)
        {
            foreach (var applicationControllerSelector in applicationController.Selectors)
            {
                if (applicationControllerSelector.AttributeRouteModel != null)
                {
                    var versionedConstraintRouteModel = new AttributeRouteModel
                    {
                        Template = _versionConstraintTemplate
                    };

                    applicationControllerSelector.AttributeRouteModel =
                        AttributeRouteModel.CombineAttributeRouteModel(versionedConstraintRouteModel,
                            applicationControllerSelector.AttributeRouteModel);
                }
                else
                {
                    applicationControllerSelector.AttributeRouteModel = new AttributeRouteModel
                    {
                        Template = _versionedControllerTemplate
                    };
                }
            }
        }
    }
}

请指教

【问题讨论】:

    标签: asp.net restful-url


    【解决方案1】:

    客户端可以通过多种方式指定所需的版本。它可以是 URL、标头、查询参数等的一部分。这完全取决于您的 API 合约期望客户端将其发送到哪里。 你可以看看这个ASP.NET Versioning

    回到您已实施的 Route 约定。查看 URL 模型,您似乎打算在 URL 中包含客户端指定的版本。如果是这样,那么您必须重新考虑您的 RouteConvention。从路由约定中删除路由的版本控制部分,并在控制器级别配置路由的版本部分。 例如。

    [Route( "v1/values" )]
    public class ValuesController : Controller
    {
        // GET api/v1/values
        [HttpGet]
        public string Get() 
        {
        }
    }
    
     [Route( "v2/values" )]
     public class Values2Controller : Controller
     {
            // GET api/v2/values
            [HttpGet]
            public string Get() 
            {
            }
     }
    

    但是,同样有多种实现版本控制的方法,您可以选择最适合您需求的方法。 ASP.NET API Versioning 应该会让你朝着正确的方向开始。

    【讨论】:

      猜你喜欢
      • 2010-11-03
      • 1970-01-01
      • 2018-02-21
      • 2021-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-18
      • 2019-11-19
      相关资源
      最近更新 更多