【问题标题】:Models from External package are showing in swagger docs外部包中的模型显示在 swagger 文档中
【发布时间】:2018-07-24 06:15:28
【问题描述】:

我正在处理 swagger 文档并添加了一个外部包“NodaTime”并用作模型中我的属性的类型 public LocalDateTime Date { get; set; } NodaTime 包中的模型显示在文档中。 请查看屏幕截图中的模型,突出显示来自 NodaTime 包。 为什么 Swagger 将其包含在文档中以及如何从文档中排除外部包。 提前致谢。

【问题讨论】:

  • 你能分享你的 swagger.json 吗?我的猜测是您正在使用这些模型来响应您的一项操作
  • 另外你用什么来生成swagger文档(Swashbuckle)?
  • 是的花花公子
  • @HelderSepu 不,我确定我没有使用那些模型,我只是使用这个包中的类型而已。
  • 如果 Swashbuckle 显示它们是因为您直接或间接使用它们,但您正在使用它们,您能分享您的 swagger.json 吗?

标签: asp.net-core swagger swagger-ui


【解决方案1】:

我猜他们出现是因为你暴露了一个使用 NodaTime 类型的对象。 Swashbuckle / Swagger 正在显示整个对象图......如果您的模型使用这些模型,则无法关闭第三方的类似功能。如果你查看 github 上library 中的代码,你可以看到 Swashbuckle 对几个基类库原语进行了特殊处理。方法是CreatePrimitiveSchema(),LocalDateTime不在case语句中。因此,作为解决此问题的方法,您可以分叉 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();
    }

【讨论】:

  • 但这会隐藏我自己的模型,我将其用作模型中的类型。喜欢顶部屏幕截图中的地址。
  • 正确,这就是 swagger 的工作方式,它显示了对象图中的模型。不显示对象图使用的对象没有多大意义。如果您不想看到第三方模型,请不要在您的 API 中使用第三方模型。使用 DTO 对象并将它们映射回服务中的其他对象。在这种情况下,AutoMapper 可能会有所帮助。
  • 我正在使用 DateTime 对象,这很好 swagger 没有深入研究它,DateTime 和 NodaTime 之间有什么区别。是什么阻止了在 DateTime 中大摇大摆地去嵌套对象?
  • 有趣的是,DateTime 和 LocalDateTime 的定义看起来非常相似。 nodatime.org/2.2.x/api/NodaTime.LocalDateTime.html, nodatime.org/2.2.x/api/NodaTime.LocalDateTime.html 都是结构体。然而,看起来 Swashbuckle 认为 DateTime 是一个原始的。 github.com/domaindrivendev/Swashbuckle/blob/…
【解决方案2】:

我不能使用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");
    }
}

在启动类中添加ConfigureServices方法

    services.AddSwaggerGen(c =>
        {
            c.DocumentFilter<RemoveVerbsFilter>();
        });

【讨论】:

  • 应该是根据原始问题接受的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-29
  • 1970-01-01
  • 1970-01-01
  • 2017-05-14
  • 1970-01-01
相关资源
最近更新 更多