JSON 和 UI 端点的 AspNetCore Swagger 返回 404

AspNetCore Swagger for JSON and UI endpoints returning 404

我正在尝试根据 Microsoft Docs here

生成我的 Swagger 文档

使用其他答案here and here在这个问题上没有取得任何进展...

我正在像这样配置 swagger gen:

serviceCollection.AddSwaggerGen(setupAction =>
    {
        setupAction.SwaggerDoc(
            "Open API Specification for Haros v1",
            new OpenApiInfo()
            {
                Title = "Haros API",
                Version = "v1",
                Description = "Haros API Description",
                Contact = new OpenApiContact()
                {
                    Email = "myname@domain",
                    Name = "My Name"
                },
                License = new OpenApiLicense()
                {
                    Name = "MIT License"
                }
            });

        setupAction.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
        {
            Type = SecuritySchemeType.Http,
            Scheme = "bearer",
            BearerFormat = "JWT",
            Description = "Attach your bearer token in this format to consume the API: Bearer {token}",
        });

        setupAction.AddSecurityRequirement(new OpenApiSecurityRequirement
        {
            {
                new OpenApiSecurityScheme
                {
                    Reference = new OpenApiReference
                    {
                        Type = ReferenceType.SecurityScheme,
                        Id = "Bearer",
                    },
                }, new List<string>()
            },
        });
    });

然后像这样添加中间件:

app.UseSwagger();

app.UseSwaggerUI(setupAction =>
{
   setupAction.SwaggerEndpoint("/swagger/v1/swagger.json", "Haros API v1");
   setupAction.RoutePrefix = string.Empty;
});

两个端点(https://localhost:5001/swagger/index.htmlhttps://localhost:5001/swagger/v1/swagger.json)都返回 404。

我已将 GenerateDocumentationFile 的选项添加到我的项目中,并使用 /// 注释装饰了我的 API 控制器端点。

我注意到的是,如果我注释掉 RoutePrefix,我会设法加载它:

我已经尽可能地关注了 Microsoft 文档 link,我没有看到任何可能遗漏的内容。有人看到我做错了什么或错过了什么吗?

(附加信息:使用 .NET 5 并通过 Kestrel 加载)

你会换成SecuritySchemeType.ApiKey吗?

 services.AddSwaggerGen(c =>
        {
            c.SwaggerDoc("v1",
                new OpenApiInfo
                {
                    Version = "v1",
                    Title = "My API",
                    Description = "My API",
                    Contact = new OpenApiContact
                    {
                        Name = "User",
                        Email = string.Empty,
                        Url = new Uri("https://github.com"),
                    }
                });

            c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
            {
                Description = "Ex: Bearer {token here}",
                Name = "Authorization",
                Scheme = "Bearer",
                BearerFormat = "JWT",
                In = ParameterLocation.Header,
                Type = SecuritySchemeType.ApiKey,
            });

            c.AddSecurityRequirement(new OpenApiSecurityRequirement
            {
                {
                    new OpenApiSecurityScheme
                    {
                        Reference = new OpenApiReference {Type = ReferenceType.SecurityScheme, Id = "Bearer"}
                    },
                    new string[] { }
                }
            });
        });

我想出了这个问题,如果你问我的话,这个问题很晦涩。无论如何, 帮助了我,基本上是我的问题。

添加你的SwaggerGen时,第一个参数name

setupAction.SwaggerDoc(
    "Open API Specification for Haros v1", //... etc
)

插入 URL 中间件部分生成的文档:

setupAction.SwaggerEndpoint("/swagger/<from swagger doc name parameter>/swagger.json", "Haros API v1");

如果你这样做:

setupAction.SwaggerDoc(
            "v1", //... etc
)

然后这样做:

setupAction.SwaggerEndpoint("/swagger/v1/swagger.json", "Haros API v1");

Swagger 将在两个端点(https://localhost:5001/swagger/index.htmlhttps://localhost:5001/swagger/v1/swagger.json)上成功加载