首页 > 解决方案 > .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 文件。(它来自一家供应商公司,我不确定我是否被允许显示它的名字。)

我试图添加过滤器来避免这个控制器文件,但它没有运行到过滤器代码中。我不确定我是否正确添加了它。

无论如何要解决这个问题?

标签: c#asp.net-coreswaggerswagger-codegen

解决方案


是的,您需要添加一个过滤器来控制此行为。这是一些帮助您包含过滤器的代码。

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);
            }
        }
    }
}

推荐阅读