我需要с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个控制器......
感谢您的帮助。
答案 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版本。请注意,这可能会破坏客户端。