外部包中的模型显示在swagger文档中

Mal*_*wan 9 swagger swagger-ui asp.net-core

我正在研究swagger文档,并添加了一个外部软件包" NodaTime ",并在模型public LocalDateTime Date { get; set; } 和模型中用作我的属性类型, 来自NodaTime软件包,在docs中显示.请看截图中的模型,突出显示的是NodaTime包.为什么Swagger将其包含在文档中以及如何从文档中排除外部包. 在此输入图像描述 提前致谢.

Get*_*zzy 7

我猜它们正在显示,因为您要暴露使用NodaTime类型的对象。Swashbuckle / Swagger正在显示整个对象图...如果您的模型使用这些模型,则无法关闭此类第三方内容。如果您查看github 上中的代码,则可以看到Swashbuckle对几种基类库原语进行了特殊处理。方法是CreatePrimitiveSchema(),caseDateTime中没有LocalDateTime。因此,为解决此问题,您可以派生Swashbuckle并添加NodaTime类型。这可能不值得。

但是,Swashbuckle允许您关闭模型扩展。在下面,您可以看到我的Swashbuckle配置设置。设置DefaultModelsExpandDepth(-1)将隐藏它们。

public void Configure(IApplicationBuilder app, IHostingEnvironment env, DataGraphContext db) {
        if (env.IsDevelopment()) {
            app.UseDeveloperExceptionPage();
        } else {
            app.UseHsts();
        }

        app.UseSwagger();

        app.UseSwaggerUI(c => {
            c.SwaggerEndpoint("/swagger/v1/swagger.json", "API V1");
            c.DefaultModelExpandDepth(0);
            c.DefaultModelsExpandDepth(-1);
        });

        app.UseAuthentication();

        app.UseExceptionHandling();
        app.UseCors("AllowSpecificOrigins");
        app.UseHttpsRedirection();
        app.UseMvc();
    }
Run Code Online (Sandbox Code Playgroud)


Mal*_*wan 7

我不能使用,DefaultModelExpandDepth(0);因为这会隐藏我自己的模型,我在模型中用作类型。所以,我曾经检查哪些类型来自外部包并像下面这样排除它们。

添加过滤器

public class RemoveVerbsFilter : IDocumentFilter
{
    public void Apply(SwaggerDocument swaggerDoc, DocumentFilterContext context)
    {
        swaggerDoc.Definitions.Remove("LocalDateTime");
        swaggerDoc.Definitions.Remove("CalendarSystem");
        swaggerDoc.Definitions.Remove("Era");
        swaggerDoc.Definitions.Remove("LocalTime");
        swaggerDoc.Definitions.Remove("LocalDate");
    }
}
Run Code Online (Sandbox Code Playgroud)

在启动类中添加ConfigureServices方法

    services.AddSwaggerGen(c =>
        {
            c.DocumentFilter<RemoveVerbsFilter>();
        });
Run Code Online (Sandbox Code Playgroud)

  • 这个答案在 Swagger 5.x 及更高版本中不再有效,因为 `SwaggerDocument` 已被 `OpenApiDocument` 取代,后者没有定义 Definitions 属性。我发现这在 Swagger 6.x 中有效: `context.SchemaRepository.Schemas.Remove("LocalTime");` (2认同)