ASP.NET配置Swagger后访问localhost/swagger出现404错误求助
问题根源
你同时在Program.cs和Startup.cs里配置Swagger,这两种配置模式(.NET 6+顶级语句模式 vs 旧版Startup类模式)在同一项目里会冲突,再加上路由配置矛盾,直接导致页面找不到:
- Program.cs里设置了
c.RoutePrefix = string.Empty;,把Swagger UI绑定到了根路径/ - 但Startup.cs里又重复注册Swagger中间件,还把根路径重定向到
/swagger/,两边路由逻辑打架,自然找不到页面
解决办法
你的项目是.NET 6及以上版本(从Program.cs写法可判断),直接统一用Program.cs的配置即可:
1. 删除Startup.cs里的Swagger相关代码
打开Startup.cs的Configure方法,删掉以下内容:
if (env.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "Quanta 5 API")); }
同时删掉根路径重定向的这段代码:
endpoints.MapGet("/", context => { context.Response.Redirect("/swagger/"); return Task.CompletedTask; });
2. 调整Program.cs的配置(二选一)
方案一:让Swagger直接在根路径访问
保留现有Program.cs的Swagger配置,此时访问https://localhost:44301/就能打开Swagger。如果想让/swagger路径也能访问,添加一个重定向端点:
var app = builder.Build(); if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1"); c.RoutePrefix = string.Empty; }); } // 添加重定向,让/swagger指向根路径 app.MapGet("/swagger", context => { context.Response.Redirect("/"); return Task.CompletedTask; }); app.MapControllers(); // 必须添加,否则控制器接口无法访问 app.Run();
方案二:让Swagger回到/swagger路径
如果不想让Swagger占用根路径,修改Program.cs里的RoutePrefix为"swagger"(默认值就是这个,也可以直接删掉这行),再加个根路径重定向:
var app = builder.Build(); if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1"); c.RoutePrefix = "swagger"; // 可省略,默认即为swagger }); } // 根路径自动跳转到swagger app.MapGet("/", context => { context.Response.Redirect("/swagger"); return Task.CompletedTask; }); app.MapControllers(); app.Run();
3. 验证
清理项目,重新生成并启动:
- 方案一:访问
https://localhost:44301/或https://localhost:44301/swagger都能打开Swagger UI - 方案二:访问
https://localhost:44301/swagger或根路径会自动跳转至Swagger页面
内容的提问来源于stack exchange,提问作者JoubasaurusREX
相关产品推荐
相关产品推荐

