.net core 不同名称的Api版本

.net core 不同名称的Api版本,.net-core,swagger,swashbuckle.aspnetcore,aspnet-api-versioning,.net Core,Swagger,Swashbuckle.aspnetcore,Aspnet Api Versioning,我在我的项目中使用asp dotnet core 3.1。目前,我建议使用1.0或2.1来对我的操作进行版本控制。但是我想通过,例如,schooljob或其他一些随机字符串值来对我的操作进行版本设置。我做了很多研究,一些网站声称可以用1.0代替1.0 但没说怎么做。另外,我不知道是否可以将版本控制更改为schooljob 我真正想做的是将我的URL从…someUrl/1.0/getTeachers更改为…someUrl/schooljob/getTeachers,这样我最终可以更好地将它们分组

我在我的项目中使用asp dotnet core 3.1。目前,我建议使用
1.0
2.1
来对我的操作进行版本控制。但是我想通过,例如,
schooljob
或其他一些随机字符串值来对我的操作进行版本设置。我做了很多研究,一些网站声称可以用
1.0
代替
1.0
但没说怎么做。另外,我不知道是否可以将版本控制更改为
schooljob

我真正想做的是将我的URL从
…someUrl/1.0/getTeachers
更改为
…someUrl/schooljob/getTeachers
,这样我最终可以更好地将它们分组

//SchoolController.cs
[ApiVersion(“1.0”)]//我想将其更改为[ApiVersion(“schooljob”)]
[ApiController]
[路由(“{version:apiVersion}”)]
公共类SchoolController:AbstractController
{
...
[HttpPost(“学校作业/getstudents”)]
公共JsonResult GetStudents([FromBody]Student)
{ ... }
}
//Startup.cs
public void配置服务(IServiceCollection服务)
{
c、 SwaggerDoc(“学校作业”),新OpenApiInfo
{
Version=“schooljob”,
Title=“学校工作”
});
//c.AddSecurityDefinition…和其他招摇配置
}   
public void配置(IApplicationBuilder应用程序、iWebHostenEnvironment环境、IServiceProvider服务提供商)
{
app.UseSwagger(c=>
{
c、 RouteTemplate=“mainproject/swagger/{documentname}/swagger.json”;
});
app.UseSwaggerUI(c=>
{
c、 SwaggerEndpoint(“/mainproject/swagger/schooljob/swagger.json”,“schooljob”);
c、 RoutePrefix=“mainproject/swagger”;
});
}

简短回答--您不能以这种方式定义API版本。它具有无法更改的规定格式。这对于排序、排序和比较很重要。例如,
1.0>1.0-beta

看起来您要做的是对API进行分组。默认行为是使用格式化的API版本文本作为API描述的组名。这是连接其他库(如Swashback或NSwag)进行分组的桥梁。有几种方法可以改变这种行为。您可以将其更改为API Explorer扩展(laIApiDescriptionProvider)或OpenAPI/Swagger文档生成器扩展。要获得想要的结果,只需对结果重新排序/分组

大多数分组是按API版本进行的,但当然也可以按资源或类别进行分组。由于API版本控制会覆盖默认组名,因此需要重新提取源属性中定义的原始组名或使用自定义属性。您可以从模板约定或其他元数据构建它

例子 首先,您需要一种方法来比较2个apiscription实例:

公共类MyComparer:IComparer
{
公共整数比较(ApiDescription x,ApiDescription y)
{
如果(x==null)
{
返回y==null?0:-1;
}
如果(y==null)
{
返回1;
}
var comparer=StringComparer.OrdinalIgnoreCase;
var result=comparer.Compare(x.GroupName,y.GroupName);
//按组名比较,然后按api版本比较
返回结果==0?x.GetApiVersion()。比较到(y.GetApiVersion()):结果;
}
}
然后,您可以创建一个自定义的IApiDescriptionProvider,用于处理发现的描述:

公共类MyAPDescriptionProvider:IApiDescriptionProvider
{
//重要提示:您可能需要增加该值,以便稍后在序列中运行
公共整数顺序=>0;
public void OnProvidersExecuting(apisDescriptionProviderContext){}
已执行ProvidersExecuted上的公共无效(ApiDescriptionProviderContext)
{
var sorted=context.Results.ToList();
sorted.Sort(新的MyComparer());
context.Results.Clear();
对于(变量i=0;i
最后,在设置中注册提供商:

services.TryAddEnumerable(
servicescriptor.Transient());

简短回答--您不能以这种方式定义API版本。它具有无法更改的规定格式。这对于排序、排序和比较很重要。例如,
1.0>1.0-beta

看起来您要做的是对API进行分组。默认行为是使用格式化的API版本文本作为API描述的组名。这是连接其他库(如Swashback或NSwag)进行分组的桥梁。有几种方法可以改变这种行为。您可以将其更改为API Explorer扩展(laIApiDescriptionProvider)或OpenAPI/Swagger文档生成器扩展。要获得想要的结果,只需对结果重新排序/分组

大多数分组是按API版本进行的,但当然也可以按资源或类别进行分组。由于API版本控制会覆盖默认组名,因此需要重新提取源属性中定义的原始组名或使用自定义属性。您可以从模板约定或其他元数据构建它

例子 首先,您需要一种方法来比较2个apiscription实例:

公共类MyComparer:IComparer
{
公共整数比较(ApiDescription x,ApiDescription y)
{
如果(x==null)
{
返回y==null?0:-1;
}
如果(y==null)
{
返回1;
}
var comparer=StringComparer.OrdinalIgnoreCase;
var result=comparer.Compare(x.GroupName,y.GroupName);
//按组名比较,然后按api版本比较
返回结果==0?x.GetApiVers