我正在研究swagger文档,并添加了一个外部软件包“ NodaTime ”,并用作我模型中属性的类型
public LocalDateTime Date { get; set; }
文档中显示了 NodaTime 包中的模型。
请在截图中查看模型,突出显示的模型来自 NodaTime 软件包。
为什么Swagger将其包括在文档中,以及如何从文档中排除外部软件包。
预先感谢。
答案 0 :(得分:6)
我猜它们正在显示,因为您要暴露使用NodaTime类型的对象。 Swashbuckle / Swagger正在显示整个对象图...如果您的模型使用这些模型,则无法关闭此类第三方东西。如果查看github上library中的代码,您会发现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();
}
答案 1 :(得分:0)
我不能使用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>();
});