Swashback使asp.net core 3.1 api swagger ui中具有相同谓词但具有多个路由的端点的所有路由参数都是必需的

Swashback使asp.net core 3.1 api swagger ui中具有相同谓词但具有多个路由的端点的所有路由参数都是必需的,swagger,swagger-ui,swashbuckle,asp.net-core-3.1,swashbuckle.aspnetcore,Swagger,Swagger Ui,Swashbuckle,Asp.net Core 3.1,Swashbuckle.aspnetcore,我正在从事asp.net core 2.2项目,并升级到asp.net core 3.1,同时还将Swashback.AspNetCore升级到5.0.0。升级后,我可以看到swagger生成的端点发生了变化 我有一个[HttpDelete]的端点,有两个不同的路由,如下所示: [HttpDelete(“{id}”)] [HttpDelete(“{id}/some/{anotherId}”)] 公共IActionResult Delete(int id,int ANOTHERD) { 返回NoC

我正在从事
asp.net core 2.2
项目,并升级到
asp.net core 3.1
,同时还将
Swashback.AspNetCore
升级到
5.0.0
。升级后,我可以看到swagger生成的端点发生了变化

我有一个
[HttpDelete]
的端点,有两个不同的路由,如下所示:

[HttpDelete(“{id}”)]
[HttpDelete(“{id}/some/{anotherId}”)]
公共IActionResult Delete(int id,int ANOTHERD)
{
返回NoContent();
}
[HttpDelete(“{id}”)]

此处只需要
id
参数。但是
id
anotherId
参数在这里也标记为必需这是错误的

[HttpDelete(“{id}/some/{anotherId}”)]

此处应同时要求
id
另一个id
参数这是正确的。

这是我的
Startup.cs

配置服务:

services.AddVersionedApiExplorer(选项=>
{
options.GroupNameFormat=“'v'VV”;
});
services.addapVersioning(选项=>
{
options.AssumeDefaultVersionWhenUnspecified=true;
options.DefaultApiVersion=新的ApiVersion(1,0);
options.ReportApiVersions=true;
options.ApiVersionReader=新的HeaderApiVersionReader(“x-api-version”);
});
var apiVersionDescriptionProvider=
services.BuildServiceProvider().GetService();
服务
.AddSwaggerGen(选项=>
{
foreach(apiVersionDescriptionProvider.ApiVersionDescriptions中的变量描述)
{
options.SwaggerDoc(
$“TestDocumentOpenAPI规范{description.GroupName}”,
新的Microsoft.OpenApi.Models.openapinfo
{
Title=“测试文档API”,
Version=description.apivision.ToString(),
Description=“测试”,
联系人=新的Microsoft.OpenApi.Models.OpenApiContact
{
电子邮件=”Test@test.com",
Name=“测试团队”,
Url=新Uri(“https://www.test.com")
}
});
}
options.AddSecurityDefinition(“载体”),新的OpenApiSecurityScheme
{
Description=“输入JWT授权头以访问此API。示例:\“授权:承载{token}\”,
Name=“授权”,
In=参数位置.Header,
类型=SecuritySchemeType.ApiKey,
Scheme=“持票人”
});
options.addSecurityRequest(新的OpenAPISecurityRequest
{
{
新的OpenApiSecurityScheme
{
Reference=新的OpenApiReference
{
Type=ReferenceType.SecurityScheme,
Id=“持票人”
}
},
新字符串[]{}
}
});
options.DocInclusionPredicate((documentName,apiDescription)=>
{
var actionApiVersionModel=apisDescription.ActionDescriptor
.GetApiVersionModel(ApiVersionMapping.Explicit | ApiVersionMapping.Implicit);
如果(actionApiVersionModel==null)
{
返回true;
}
if(actionApiVersionModel.DeclaredApiVersions.Any())
{
返回actionApiVersionModel.DeclaredApiVersions.Any(v=>
$“TestDocumentOpenAPSpecificationV{v.ToString()}”==documentName);
}
返回actionApiVersionModel.ImplementedApiVersions.Any(v=>
$“TestDocumentOpenAPSpecificationV{v.ToString()}”==documentName);
});
//var xmlCommentsFile=$“{Assembly.GetExecutionGassembly().GetName().Name}.xml”;
//var xmlcomentsfullpath=Path.Combine(AppContext.BaseDirectory,xmlcomentsfile);
//选项。includexmlcoments(xmlcomentsfullpath);
});
配置:

app.UseSwagger();
app.UseSwaggerUI(选项=>
{
foreach(apiVersionDescriptionProvider.ApiVersionDescriptions中的变量描述)
{
options.swagger端点(
$“/swagger/TestDocumentOpenAPISpecification{description.GroupName}/swagger.json”,
$“测试文档API-{description.GroupName.ToUpperInvariant()}”);
}
options.RoutePrefix=string.Empty;
选项。默认模式扩展深度(2);
options.DefaultModelRendering(swashback.AspNetCore.SwaggerUI.ModelRendering.Model);
options.DocExpansion(swashback.AspNetCore.SwaggerUI.DocExpansion.None);
options.DisplayRequestDuration();
options.EnableValidator();
options.EnableFilter();
options.EnableDeepLinking();
options.DisplayOperationId();
});

生成的招摇过市使两条路线中的
另一个
都是强制性的。以前不是这样的。我尝试将
Name
添加到两条路由,但仍然失败。请帮助说明我的错误。

经过一些分析后,我使用
IOperationFilter
进行了此操作

公共类DeleteOperationFilter:IOperationFilter
{
公共无效应用(OpenApiOperation操作,OperationFilterContext上下文)
{
if(context.apiscription.HttpMethod==“DELETE”&&context.MethodInfo.Name==“DELETE”)
{
foreach(context.apiscription.ParameterDescriptions中的var参数)
{
if(parameter.RouteInfo==null)
{
operation.Parameters.Single(x=>x.Name.Equals(parameter.Name)).Required=false;
}
}
返回;
}
}
}
并将其添加到
配置服务中

services.AddSwaggerGen(选项=>
{
...
options.OperationFilter();
};
我不确定这是否是最好的方法,但这是有效的。如果我错了,请纠正我。

我认为