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

Ocelot网关Swagger无法显示微服务端点问题求助

Ocelot网关Swagger无法加载微服务端点问题排查

问题描述

  • 通过Ocelot网关可正常调用points-service微服务接口,但Swagger无法加载该微服务的端点
  • 网关日志出现警告:

warn: Ocelot.Responder.Middleware.ResponderMiddleware[0]
2024-10-30 21:04:21 requestId: 0HN7P2MKOVR6R:00000001, previousRequestId: No PreviousRequestId, message: 'Error Code: UnableToFindDownstreamRouteError Message: Failed to match Route configuration for upstream path: /, verb: GET. errors found in ResponderMiddleware. Setting error response for request path:/, request method: GET'

  • 在网关容器内执行curl http://points-service:5001/swagger/v1/swagger.json可正常获取微服务Swagger配置文件

排查与修复方案

1. 补充Swagger代理路由并修正Swagger地址

当前Ocelot路由仅覆盖了/api/*路径,缺少Swagger相关路径的代理规则,且SwaggerEndPoints中配置的是微服务直接地址,无法通过网关正常访问。修改ocelot.json如下:

{
  "Routes": [
    // 原有API路由
    {
      "DownstreamPathTemplate": "/api/{everything}",
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [
        {
          "Host": "points-service",
          "Port": 5001
        }
      ],
      "UpstreamPathTemplate": "/api/{everything}",
      "UpstreamHttpMethod": [ "Get", "Post", "Put", "Delete" ],
      "SwaggerKey": "points"
    },
    // 新增Swagger文件代理路由
    {
      "DownstreamPathTemplate": "/swagger/{everything}",
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [
        {
          "Host": "points-service",
          "Port": 5001
        }
      ],
      "UpstreamPathTemplate": "/points/swagger/{everything}",
      "UpstreamHttpMethod": [ "Get" ],
      "SwaggerKey": "points"
    }
  ],
  "GlobalConfiguration": {
    "BaseUrl": "http://gateway-api:5000"
  },
  "SwaggerEndPoints": [
    {
      "Key": "points",
      "Config": [
        {
          "Name": "Points API",
          "Version": "v1",
          // 改为网关代理后的路径
          "Url": "/points/swagger/v1/swagger.json"
        }
      ]
    }
  ]
}

2. 调整中间件执行顺序

中间件顺序错误会导致Swagger和Ocelot的逻辑冲突,修改Program.cs的中间件顺序:

using API;
using Confluent.Kafka;
using Ocelot.DependencyInjection;
using Ocelot.Middleware;

var builder = WebApplication.CreateBuilder(args);

var producerConfig = new ProducerConfig();
builder.Configuration.GetSection("Kafka").Bind(producerConfig);
builder.Configuration.AddJsonFile("ocelot.json", true, true);
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();

builder.Services.AddOcelot(builder.Configuration);
builder.Services.AddSwaggerForOcelot(builder.Configuration);
builder.Services.AddSwaggerGen();

builder.Services.AddSingleton<ProducerConfig>(producerConfig);

var app = builder.Build();
app.UseDeveloperExceptionPage();

// 调整中间件顺序,确保Swagger与Ocelot逻辑正确执行
app.UseSwagger()
   .UseSwaggerForOcelotUI()
   .UseRouting()
   .UseEndpoints(endpoints => 
   {
       endpoints.MapControllers();
   })
   .UseOcelot().Wait();

app.Run();

移除原有的UseSwaggerUI单独配置,统一通过UseSwaggerForOcelotUI访问聚合Swagger界面,地址为http://localhost:52791/swagger

3. 修正Docker环境变量格式

docker-compose.yml中的环境变量存在空格、多余逗号的语法错误,会导致ASP.NET Core启动配置异常:

services:
  gateway-api:
    container_name: gateway-api
    ports:
    - "52791:5000"
    build:
      context: .
      dockerfile: API/Dockerfile
    environment:
      - ASPNETCORE_URLS=http://*:5000
      - ASPNETCORE_HTTPS_PORTS=5050
      - ASPNETCORE_HTTP_PORTS=5000
  points-service:
    container_name: points-service
    depends_on:
    - gateway-api 
    ports:
    - "52792:5001"
    environment:
      - ASPNETCORE_URLS=http://*:5001
      - ASPNETCORE_HTTPS_PORTS=5051
      - ASPNETCORE_HTTP_PORTS=5001
    build:
      context: .
      dockerfile: Services/PointsService/PointsService.Api/Dockerfile

4. 验证效果

重启所有容器后,访问http://localhost:52791/swagger,即可看到Points API的选项,切换后能正常加载微服务的所有端点。

内容的提问来源于stack exchange,提问作者Faradey Inimicos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 18:55:53