ASP.NET Core 2 API经APIGEE代理后Swagger无法正常工作
我之前也碰到过类似的代理路径适配问题,核心原因是Apigee给你的服务加了/myapp前缀,但Swagger默认的路径配置没考虑这个代理上下文,导致swagger.json请求和接口调用的路径都出了问题。下面给你几个针对性的解决方案:
方案一:配置SwaggerUI使用相对路径(快速解决)
修改UseSwaggerUI的SwaggerEndpoint路径,用基于当前SwaggerUI页面的相对路径,而不是根路径或上级路径:
app.UseSwaggerUI(c => { // 用./替代../,基于当前/swagger路径的相对位置 c.SwaggerEndpoint("./v1/swagger.json", "My Web API v1"); });
当你访问https://mysite.apigee.net/myapp/swagger时,这个相对路径会被解析为https://mysite.apigee.net/myapp/swagger/v1/swagger.json,正好匹配你需要的正确路径。
方案二:添加服务器配置修正接口调用前缀
上面的方法能解决swagger.json的获取问题,但接口调用可能还是会丢前缀,这时候需要给Swagger文档添加服务器上下文配置,让SwaggerUI知道要在接口路径前加上/myapp:
services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new Info { Version = "v1", Title = "My Web API", Description = "An awesome API.", TermsOfService = "", Contact = new Contact { Name = "...", Email = "...", Url = "http://..." } }); c.IncludeXmlComments(GetXmlCommentsPath("Project1.xml")); c.IncludeXmlComments(GetXmlCommentsPath("Project2.xml")); // 添加Apigee代理环境的服务器配置 c.AddServer(new OpenApiServer { Url = "/myapp", Description = "Apigee代理环境" }); // 同时保留本地调试的服务器配置 c.AddServer(new OpenApiServer { Url = "", Description = "本地/IIS环境" }); });
这样SwaggerUI会在接口调用时自动拼接/myapp前缀,确保请求路径是https://mysite.apigee.net/myapp/about而不是https://mysite.apigee.net/about。
方案三:全局设置PathBase(适配代理上下文)
如果你的服务固定运行在Apigee代理下(或者可以通过配置区分环境),可以在Startup的Configure方法开头设置全局的PathBase,让整个应用都适配这个前缀:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 可以从配置文件、环境变量读取,避免硬编码 var proxyPathBase = Configuration["Proxy:PathBase"] ?? "/myapp"; if (!string.IsNullOrEmpty(proxyPathBase)) { app.UsePathBase(proxyPathBase); } // 后续的中间件配置... app.UseSwagger(); app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "My Web API v1"); }); }
这个方法会让整个应用的所有路由都自动带上/myapp前缀,包括Swagger的请求和接口调用,适合固定代理环境的场景。
推荐你先试试方案一+方案二的组合,既能快速解决swagger.json的404问题,又能保证接口调用路径正确,同时兼容本地调试和代理环境。
内容的提问来源于stack exchange,提问作者Stephan Hoffmann

