You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core 7 Web API端点前缀设置:Swagger未显示配置前缀

问题分析与解决

你的核心问题是仅设置了应用的PathBase,但未配置Swagger适配这个路由前缀,同时中间件顺序也需要调整到位。

关键修改点

1. 调整中间件顺序(必须确保UsePathBase在最靠前的位置)

UsePathBase 需要在所有其他中间件(包括Swagger、路由、认证等)之前注册,这样整个请求管道都会基于这个前缀处理请求。

2. 显式配置Swagger适配路由前缀

Swagger不会自动识别UsePathBase设置的前缀,需要手动配置Swagger的文档路径和UI路由:

  • 在UseSwagger中通过RouteTemplate指定带前缀的文档路径,同时修正Swagger文档中的服务器地址
  • 在UseSwaggerUI中设置对应的路由前缀和文档端点

完整修改后的Program.cs代码

var builder = WebApplication.CreateBuilder(args);

// 读取配置并注册服务
builder.Services.Configure<BaseRoute>(builder.Configuration.GetSection("BaseRoute"));
var baseroute = builder.Configuration.GetSection("BaseRoute").Get<BaseRoute>();
builder.Services.AddSingleton(resolver => resolver.GetRequiredService<IOptions<BaseRoute>>().Value);

// 添加控制器与Swagger基础服务
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

// 1. 必须最先注册UsePathBase
app.UsePathBase(new PathString(baseroute.Base));

// 2. 配置Swagger适配路由前缀
if (app.Environment.IsDevelopment())
{
    app.UseSwagger(c =>
    {
        c.RouteTemplate = "swagger/{documentName}/swagger.json";
        // 修正Swagger文档中的服务器地址,确保接口前缀正确显示
        c.PreSerializeFilters.Add((swaggerDoc, httpReq) =>
        {
            swaggerDoc.Servers = new List<OpenApiServer> 
            { 
                new OpenApiServer { Url = $"{httpReq.Scheme}://{httpReq.Host.Value}{baseroute.Base}" } 
            };
        });
    });
    
    app.UseSwaggerUI(c =>
    {
        // 让SwaggerUI直接挂载在PathBase根路径(比如/myapi/)
        c.RoutePrefix = string.Empty;
        // 指定Swagger文档的完整端点路径
        c.SwaggerEndpoint($"{baseroute.Base.TrimEnd('/')}/swagger/v1/swagger.json", "My API V1");
    });
}

// 后续中间件按标准顺序注册
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseMiddleware<JwtRefresher>();

app.MapControllers();

app.Run();

额外说明

  • 建议将配置中的Base值改为不带末尾斜杠的格式(比如/myapi),避免路径拼接时出现重复斜杠的问题
  • 如果希望SwaggerUI挂载在/myapi/swagger路径下,只需将c.RoutePrefix的值改为"swagger"即可

内容的提问来源于stack exchange,提问作者Pieter Dreissen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 23:43:18