1

我需要澄清一下。我有 .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";
    }
}

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 个控制器......

感谢帮助。

4

2 回答 2

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

于 2017-06-19T13:04:51.837 回答
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 版本。请注意,这可能会破坏客户端。

于 2019-06-29T19:41:09.880 回答