【问题标题】:aspnet-api-versioning - backward compatibilityaspnet-api-versioning - 向后兼容性
【发布时间】:2017-11-18 05:06:43
【问题描述】:

我需要澄清一下。 我有 .net mvc 应用程序,我使用 Microsoft/aspnet-api-versioning(用于 ASP.NET Core)。 我有 2 个控制器:

[ApiVersion("1.0")]
[Route("[controller]")]
public class OneController : Controller
{

    [HttpGet]
    public string Get()
    {
       return "Hello. I'm OneController";
    }
}

[ApiVersion("1.1")]
[Route("[controller]")]
public class TwoController : Controller
{

    [HttpGet]

    public string Get()
    {
        return "Hello. I'm TwoController";
    }
}

我在使用 OneController 发布 API 后添加的两个控制器。 现在,如果我尝试使用 "http://localhost:59719/One?api-version=1.1" 我会看到错误:

与请求 URI“http://localhost:59719/test?api-version=1.1”匹配的 HTTP 资源不支持 API 版本“1.1”。

我应该为不同的控制器使用不同的版本,还是有办法为任何请求使用一个(最新的)版本?

我知道我可以将 [ApiVersion("1.1")] 添加到所有控制器,但如果我有 20 个控制器...

感谢您的帮助。

【问题讨论】:

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


    【解决方案1】:

    您可以使用ApiVersioningOptions 类定义默认的 api 版本,如果未指定,则使用此默认版本:

    `services.AddApiVersioning(o =>
    {
        o.AssumeDefaultVersionWhenUnspecified = true;
        o.DefaultApiVersion = new ApiVersion(1 , 0);
    });`
    

    此外,您还应该看看 Scott Hanselman 关于 ASP.NET 中的 API 版本控制的这篇优秀文章: https://www.hanselman.com/blog/ASPNETCoreRESTfulWebAPIVersioningMadeEasy.aspx

    【讨论】:

      【解决方案2】:

      在上面的示例中,您有两个具有两个不同 API 版本的不同控制器。这两者之间没有直接关系。如果您尝试以集中方式应用 API 版本,则可以使用 Conventions API 实现此目的。您甚至可以通过 IControllerConvention 界面创作和应用自己的约定。

      // same result as the attributes above
      options.Conventions.Controller<OneController>().HasVersion(1,0);
      options.Conventions.Controller<TwoController>().HasVersion(1,1);
      
      // can also be achieved using only controller types
      options.Conventions.Controller(typeof(OneController)).HasVersion(1,0);
      options.Conventions.Controller(typeof(TwoController)).HasVersion(1,1);
      
      
      // register your own convention that applies API versions to all controllers
      options.Conventions.Add(new MyCustomApiVersionConvention());
      

      您也可以使用类似于@arnaudauroux 建议的方法,即:

      services.AddApiVersioning(options =>
      {
        options.AssumeDefaultVersionWhenUnspecified = true;
        options.ApiVersionSelector = new CurrentImplementationApiVersionSelector(options);
      });
      

      现在,任何没有 API 版本的请求都将选择当前(或最高)可用的 API 版本。请注意,这可能会破坏客户端。

      【讨论】:

        猜你喜欢
        • 2020-02-28
        • 2018-10-25
        • 1970-01-01
        • 2018-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-17
        相关资源
        最近更新 更多