ASP.NET Core Web API:如何为Swagger请求URL添加api子文件夹?
解决ASP.NET Core 7 Swagger端点前缀适配api子文件夹的问题
你的核心问题是API部署在api子文件夹下,但Swagger生成的端点未自动带上该前缀,同时修改控制器Route会导致重复前缀。以下是无需修改控制器Route的解决方案:
1. 配置应用的路径基址(PathBase)
在Program.cs中,将应用的路径基址设置为/api,这会让应用自动处理所有以/api开头的请求,同时Swagger会自动识别这个前缀生成正确的端点URL。
注意:这行代码必须放在UseRouting之前。
// Program.cs var builder = WebApplication.CreateBuilder(args); // 注册Swagger服务 builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "你的API名称", Version = "v1" }); }); // 其他服务注册... var app = builder.Build(); // 配置路径基址,必须在UseRouting之前 app.UsePathBase("/api"); app.UseRouting(); // 其他中间件(认证、授权等)... // 配置Swagger中间件 app.UseSwagger(c => { // 调整Swagger JSON文件的路由模板,适配PathBase c.RouteTemplate = "swagger/{documentName}/swagger.json"; }); app.UseSwaggerUI(c => { // 指定Swagger JSON的地址(相对PathBase的路径) c.SwaggerEndpoint("/swagger/v1/swagger.json", "你的API V1"); // 设置Swagger UI的路由前缀,对应访问地址:https://[domain]/api/swagger/index.html c.RoutePrefix = "swagger"; }); app.MapControllers(); app.Run();
2. 恢复控制器的Route配置
将控制器上的[Route("api/[controller]")]改回[Route("[controller]")],避免重复前缀:
namespace ApiProject.Controllers { [Route("[controller]")] [ApiController] public class CompaniesController : ControllerBase { // 控制器逻辑... } }
效果说明
- 实际API端点URL:
https://[domain]/api/companies/getall(符合部署在api子文件夹的要求) - Swagger UI访问地址:
https://[domain]/api/swagger/index.html(保持你的原有访问路径) - Swagger中生成的所有端点都会自动带上
/api前缀,调用时不会再指向根目录,解决HTTP 500错误
内容的提问来源于stack exchange,提问作者siba36
相关产品推荐
相关产品推荐

