我发现的一个可能的解决方案是将实现IOperationFilter
接口的SwaggerOperationIdFilter
添加到AddSwaggerGen
.此过滤器用于动态设置Swagger操作的OperationId.
Program.cs(启动)
在Swagger生成过程中,将SwaggerOperationIdFilter注册为操作筛选器.
services.AddSwaggerGen(options =>
{
options.OperationFilter<SwaggerOperationIdFilter>();
// ... other SwaggerGen configurations
}
SwaggerOperationIdFilter.cs的实现
public class SwaggerOperationIdFilter : IOperationFilter
{
public void Apply(OpenApiOperation operation, OperationFilterContext context)
{
// Check if it's a MapIdentityApi action
if (context.ApiDescription.ActionDescriptor is not ControllerActionDescriptor controllerActionDescriptor)
{
var relativePath = context.ApiDescription.RelativePath ?? "";
operation.OperationId = $"{GenerateOperationIdBaseString(relativePath)}_{context.ApiDescription.HttpMethod}";
return;
}
// For other controller actions, set OperationId based on controller and action names
operation.OperationId = $"{controllerActionDescriptor.ControllerName}_{controllerActionDescriptor.ActionName}_{context.ApiDescription.HttpMethod}";
}
// Helper Method to extract the controller and the action name
private static string GenerateOperationIdBaseString(string inputString)
{
var input = inputString.Split('/');
if (input.Length == 0)
{
return string.Empty;
}
var controllerName = input[0].FirstCharToUpper();
var actionName = string.Join("", input.Skip(1).Select(word => word.FirstCharToUpper()));
return $"{controllerName}_{actionName}";
}
}