You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 7.0 Minimal API中.WithOpenApi()导致Swagger参数文档丢失问题

问题解答:保留.WithOpenApi()时Swagger参数描述丢失的解决方案

1. 保留.WithOpenApi()同时显示参数文档的方法

当调用.WithOpenApi()时,默认会生成全新的OpenApiOperation实例,覆盖掉框架自动推断的参数描述等元数据。要保留参数描述,有两种可行方案:

方案一:在.WithOpenApi()委托中手动合并原有参数描述

在配置端点时,通过.WithOpenApi()的委托参数,从API描述中获取原始参数描述并赋值给生成的OpenApiOperation:

app.MapGet("/api/test", MyHandler)
   .WithOpenApi(operation => {
       // 获取当前端点的API描述
       var apiDescription = app.Services.GetRequiredService<IApiDescriptionGroupCollectionProvider>()
           .ApiDescriptionGroups.Items
           .SelectMany(group => group.Items)
           .FirstOrDefault(desc => desc.RelativePath == "/api/test");
       
       if (apiDescription != null)
       {
           // 遍历参数,补全描述
           foreach (var param in operation.Parameters)
           {
               var originalParam = apiDescription.ParameterDescriptions
                   .FirstOrDefault(p => p.Name == param.Name);
               if (originalParam != null && !string.IsNullOrEmpty(originalParam.Description))
               {
                   param.Description = originalParam.Description;
               }
           }
       }
       return operation;
   });

方案二:自定义操作过滤器全局处理

创建一个IOperationFilter实现类,自动为所有操作补全参数描述,无需逐个端点配置:

public class PreserveParameterDescriptionFilter : IOperationFilter
{
    public void Apply(OpenApiOperation operation, OperationFilterContext context)
    {
        foreach (var param in operation.Parameters)
        {
            var apiParam = context.ApiDescription.ParameterDescriptions
                .FirstOrDefault(p => p.Name == param.Name);
            if (apiParam != null && !string.IsNullOrEmpty(apiParam.Description))
            {
                param.Description = apiParam.Description;
            }
        }
    }
}

然后在注册SwaggerGen时添加该过滤器:

builder.Services.AddSwaggerGen(options =>
{
    options.OperationFilter<PreserveParameterDescriptionFilter>();
});

2. 问题归属与是否需要提交修复

这个问题属于Swashbuckle.AspNetCore的设计细节问题:.WithOpenApi()的默认逻辑是创建全新的OpenApiOperation,而非基于框架自动生成的API元数据进行增量修改,导致原有参数描述丢失。

如果希望优化这个体验,建议向Swashbuckle.AspNetCore的代码仓库提交Issue,提议修改.WithOpenApi()的默认行为,或者提供更便捷的API来合并原有元数据,避免开发者手动处理。

内容的提问来源于stack exchange,提问作者Xorcist

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 00:30:44