带有 Swagger 的 Asp.Net Core:404 响应 swagger.json,没有任何错误

问题描述 投票:0回答:1

在我的 Swagger 页面上出现常见的“响应状态为 404 https://localhost:7247/swagger/v1/swagger.json”错误。

如果我手动打开并访问该页面,我不会收到任何 Asp.Net 错误,我也只会收到 404 响应。

此问题的大多数示例都会在控制台中显示错误,可以解决这些错误以修复生成的 swagger.json 的缺失。

就我而言,当我运行 Asp.Net Core 应用程序时,终端中没有显示任何错误。

使用net7.0运行,我的大部分nuget包都是7.0.12版本

我只定义了 2 个控制器,通过编译设置禁用它们并不能解决此问题,所以我不认为这是控制器路由配置错误导致的问题。

我的Program.cs如下:

public static async Task Main(string[] args)
{
    var builder = WebApplication.CreateBuilder(args);

    var config = EnsureConfig(builder);
    builder.Services.AddDbContext<NotesDbContext>(options =>
    {
        options.UseNpgsql(config.Database.ConnectionString);
    });

    EnsureIdentity(builder, config);

    builder.Services.AddControllers();

    if (builder.Environment.IsDevelopment())
    {
        EnsureSwagger(builder); //Breakpoint here does get hit
    }

    builder.Services.AddBusinessServices();

    var app = builder.Build();

    using (var scope = app.Services.CreateScope())
    {
        var dbInitService = scope.ServiceProvider.GetRequiredService<IDatabaseInitService>();
        await dbInitService.InitAsync();
    }

    app.UseHttpsRedirection();

    if (app.Environment.IsDevelopment())
    {
        app.UseSwagger();  //Breakpoint here does get hit
        app.UseSwaggerUI();
    }

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseStaticFiles();

    app.MapControllers();
    app.MapFallbackToFile("index.html");

    await app.RunAsync();
}

private static NotesConfig EnsureConfig(WebApplicationBuilder builder)
{
    var config = builder.Configuration.Get<NotesConfig>() ??
                 throw new ConfigurationErrorsException(
                     "Invalid Configuration, please validate configuration integrity"
                 );
    config.Validate();

    builder.Services.AddSingleton(config);
    return config;
}

private static void EnsureSwagger(WebApplicationBuilder builder)
{
    builder.Services.AddEndpointsApiExplorer();
    builder.Services.AddSwaggerGen(options =>
    {
        options.SwaggerDoc("Notes", new()
        {
            Description = "Open API Docs for Notes v1",
            Title = "Notes",
            Version = "v1",
            Contact = new()
            {
                Email = "st[email protected]",
                Name = "Steffen Blake",
                Url = new Uri("https://technically.fun"),
            }
        });
        options.AddSecurityDefinition("Bearer", new()
        {
            In = ParameterLocation.Header,
            Description = "Please insert JWT with Bearer into field",
            BearerFormat = "Bearer <token>",
            Name = "Authorization",
            Type = SecuritySchemeType.ApiKey
        });
        options.AddSecurityRequirement(new OpenApiSecurityRequirement
        {
            {
                new OpenApiSecurityScheme
                {
                    Reference = new OpenApiReference
                    {
                        Type = ReferenceType.SecurityScheme,
                        Id = "Bearer"
                    }
                },
                // scopes
                new string[] { }
            }
        });
    });
}

private static void EnsureIdentity(WebApplicationBuilder builder, NotesConfig config)
{
    builder.Services
        .AddDefaultIdentity<NotesUser>(options =>
        {
            options.Lockout = config.Identity.Lockout;
            options.Password = config.Identity.Password;
            options.SignIn = config.Identity.SignIn;
            options.User = config.Identity.User;
        })
        .AddRoles<IdentityRole>()
        .AddEntityFrameworkStores<NotesDbContext>();

    builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(options =>
        {
            var key = Encoding.UTF8.GetBytes(config.Signing.JWTSecret);
            options.TokenValidationParameters = new()
            {
                ValidateIssuer = true,
                ValidateAudience = true,
                ValidateLifetime = true,
                ValidateIssuerSigningKey = true,
                ValidIssuer = NotesConstants.JWT_ISSUER,
                ValidAudience = NotesConstants.JWT_ISSUER,
                IssuerSigningKey = new SymmetricSecurityKey(key)
            };
        });
}

我猜这是“您以稍微错误的顺序声明了您的服务或应用程序的注册,因此它默默地失败”的情况之一,所以我一直在翻转声明的顺序,看看它是否可以解决这种情况,但没有到目前为止,骰子。

我的 swagger 配置的某些部分也可能是错误的,我猜,导致它默默地失败?

c# asp.net-core .net-core swagger swashbuckle
1个回答
0
投票

找到具体案例,和这里的评论是一样的: https://stackoverflow.com/a/53521371/7839602

修复了 Swagger gen 部分添加的内容:

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI(options =>
    {
        options.SwaggerEndpoint("/swagger/Notes/swagger.json", "Notes");
    });
}

重要的部分是

options.SwaggerDoc(...)
中的第一个参数必须与
options.SwaggerEndpoint(...)
的第二个url片段相同。

以我为例

Notes

© www.soinside.com 2019 - 2024. All rights reserved.