在我的 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 配置的某些部分也可能是错误的,我猜,导致它默默地失败?
找到具体案例,和这里的评论是一样的: 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