.NET 8 Web API部署AKS后Swagger UI无法访问求助
1. 核对Swagger路由与访问路径的匹配性
检查Program.cs中的Swagger注册代码,确保路由前缀和你访问的/api/registration/swagger完全对应。如果你的API设置了全局路由前缀api/registration,需要同步配置Swagger的路由前缀:
app.UseSwaggerUI(options => { options.SwaggerEndpoint("/swagger/v1/swagger.json", "API V1"); options.RoutePrefix = "api/registration/swagger"; // 必须和访问路径的前缀一致 });
如果未设置RoutePrefix,默认前缀是swagger,此时访问路径应改为http://test-dev.abcword.com/swagger/index.html(前提是API没有全局路由前缀)。
2. 确认环境变量在AKS Pod中生效
尽管日志显示Swagger已加载,仍需验证Pod内的环境变量是否符合预期。执行以下命令进入Pod查看环境变量:
kubectl exec -it <你的Pod名称> -- printenv
检查控制Swagger启用的变量(比如ASPNETCORE_ENVIRONMENT或自定义的EnableSwagger)是否为触发Swagger注册的有效值,排除代码判断逻辑未正确触发的可能。
3. 检查AKS Ingress路由规则
如果使用Ingress暴露服务,需确保Ingress规则允许Swagger相关路径的流量转发。示例Ingress配置需包含对应路径:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: test-dev-ingress spec: rules: - host: test-dev.abcword.com http: paths: - path: /api/registration pathType: Prefix backend: service: name: your-api-service port: number: 80
注意pathType: Prefix会匹配该路径下的所有子路径,因此/api/registration/swagger/*会被自动转发。如果存在路由冲突或Ingress控制器配置异常,需调整规则确保路径匹配。
4. 验证API中间件顺序
在Program.cs中,中间件顺序直接影响路由处理逻辑,确保UseSwagger和UseSwaggerUI的位置正确:
app.UseRouting(); app.UseAuthorization(); // 环境变量判断后启用Swagger if (env.IsDevelopment() || Environment.GetEnvironmentVariable("EnableSwagger") == "true") { app.UseSwagger(); app.UseSwaggerUI(); } app.UseEndpoints(endpoints => { endpoints.MapControllers(); });
若Swagger中间件放在UseAuthorization之前或UseEndpoints之后,可能导致路由无法被正确解析。
5. 测试容器内部的Swagger访问
进入Pod内部,直接curl测试Swagger路径,定位问题是在应用内部还是外部路由:
kubectl exec -it <你的Pod名称> -- curl http://localhost:80/api/registration/swagger/index.html
如果此命令返回正常,说明问题出在Ingress或外部网络配置;若同样返回404,则需重新检查应用内部的Swagger配置。
内容的提问来源于stack exchange,提问作者Devin

