aspnet-api-versioning - 向后兼容性

时间:2017-06-15 15:56:40

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

我需要сlarify。 我有.net mvc app,我使用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";
    }
}

TwoController我在发布API后添加了OneController。 现在,如果我尝试使用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个控制器......

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

您可以使用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

答案 1 :(得分:0)

在上面的示例中,您有两个具有两个不同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版本。请注意,这可能会破坏客户端。