c# - .net core/swagger - 生成 swagger.json 文件时如何绕过控制器文件?
问题描述
我已经处理了一个项目并试图为它添加一个招摇的文档。(使用 Swashbuckle.AspNetCore)
我应该正确配置一切。
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new Info { Title = "HCP API", Version = "v1" });
var xmlPath = Path.Combine(AppContext.BaseDirectory, "XXXXXXXX.WebForApi.xml");
c.IncludeXmlComments(xmlPath);
});
app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "HCP Api V1");
});
但是,生成 swagger.json 文件时出现异常。
System.NotSupportedException: Ambiguous HTTP method for action - XXXXXXXXX.Frameworks.Users.ApiControllers.SystemUserController.ApiModel (XXXXXXXXX.Framework.Users). Actions require an explicit HttpMethod binding for Swagger 2.0
at Swashbuckle.AspNetCore.SwaggerGen.SwaggerGenerator.CreatePathItem(IEnumerable`1 apiDescriptions, ISchemaRegistry schemaRegistry)
at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer)
at Swashbuckle.AspNetCore.SwaggerGen.SwaggerGenerator.CreatePathItems(IEnumerable`1 apiDescriptions, ISchemaRegistry schemaRegistry)
at Swashbuckle.AspNetCore.SwaggerGen.SwaggerGenerator.GetSwagger(String documentName, String host, String basePath, String[] schemes)
at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
at Microsoft.AspNetCore.ResponseCaching.ResponseCachingMiddleware.Invoke(HttpContext httpContext)
at Microsoft.AspNetCore.ResponseCompression.ResponseCompressionMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Server.IIS.Core.IISHttpContextOfT`1.ProcessRequestAsync()
导致此错误的文件是通过 NuGet 包含在项目中的 DLL 文件。(它来自一家供应商公司,我不确定我是否被允许显示它的名字。)
我试图添加过滤器来避免这个控制器文件,但它没有运行到过滤器代码中。我不确定我是否正确添加了它。
无论如何要解决这个问题?
解决方案
是的,您需要添加一个过滤器来控制此行为。这是一些帮助您包含过滤器的代码。
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });
c.DocumentFilter<HideInDocsFilter>();
});
这是我的伪过滤器代码。
public class HideInDocsFilter : IDocumentFilter
{
public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
{
foreach (var apiDescription in context.ApiDescriptions)
{
if(apiDescription.RelativePath.Equals("SystemUser", System.StringComparison.OrdinalIgnoreCase))
{
var route = "/" + apiDescription.RelativePath.TrimEnd('/');
swaggerDoc.Paths.Remove(route);
}
}
}
}
推荐阅读
- javascript - assert.isBoolean 没有传递给 tinyint
- assembly - 如何在程序集/C 内核中管理分页?
- android - 约束流量百分比无法正常工作
- python - 有没有办法从 TimeToGuess 类访问我的guesses_left 变量,以便我需要检查它们是否用完猜测
- r - R没有从CSV导入所有行
- django - 如何在 django 中将上下文变量放入模板标签 - 修改 Wagtail Menus 模板标签
- c# - 多个连接到同一 TransactionScope 中的同一 DB
- ios - 如何在 Swift 中为 OTP 倒计时
- ios - 更改 UIAlertViewController 色调颜色
- windows - windows azure vm 将端点暴露给互联网