来自外部包的模型显示在 swagger 文档中
Models from External package are showing in swagger docs
我正在处理 swagger 文档并添加了一个外部包“NodaTime”并用作我在模型中的属性的类型
public LocalDateTime Date { get; set; }
NodaTime 包中的模型显示在文档中。
请查看屏幕截图中的模型,突出显示来自 NodaTime 包。
为什么 Swagger 将其包含在文档中以及如何从文档中排除外部包。
提前致谢。
我猜它们出现是因为您公开了一个使用 NodaTime 类型的对象。 Swashbuckle / Swagger 正在显示整个对象图......如果您的模型使用这些模型,则无法关闭此类第三方的东西。如果您查看 github 上的 library 中的代码,您会发现 Swashbuckle 对几个基础 class 库基元进行了特殊处理。方法是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();
}
我不能使用 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");
}
}
在启动中添加classConfigureServices方法
services.AddSwaggerGen(c =>
{
c.DocumentFilter<RemoveVerbsFilter>();
});
我正在处理 swagger 文档并添加了一个外部包“NodaTime”并用作我在模型中的属性的类型
public LocalDateTime Date { get; set; }
NodaTime 包中的模型显示在文档中。
请查看屏幕截图中的模型,突出显示来自 NodaTime 包。
为什么 Swagger 将其包含在文档中以及如何从文档中排除外部包。
我猜它们出现是因为您公开了一个使用 NodaTime 类型的对象。 Swashbuckle / Swagger 正在显示整个对象图......如果您的模型使用这些模型,则无法关闭此类第三方的东西。如果您查看 github 上的 library 中的代码,您会发现 Swashbuckle 对几个基础 class 库基元进行了特殊处理。方法是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();
}
我不能使用 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");
}
}
在启动中添加classConfigureServices方法
services.AddSwaggerGen(c =>
{
c.DocumentFilter<RemoveVerbsFilter>();
});