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

.NET 6 Docker容器中基于Ocelot搭建API网关无法正常运行求助

排查Ocelot网关Docker部署后无响应的问题

看起来你在.NET 6中搭建Ocelot网关时遇到了容器启动后无响应的问题,我来帮你一步步排查可能的问题点:

1. 先修正中间件顺序问题

你的program.cs里中间件的顺序有问题,Ocelot的中间件需要在路由之后、端点处理之前执行,而且空API项目其实不需要UseEndpoints(因为没有控制器),调整后的代码如下:

using Ocelot.DependencyInjection;
using Ocelot.Middleware;

var builder = WebApplication.CreateBuilder(args);

builder.Host.UseContentRoot(Directory.GetCurrentDirectory())
    .ConfigureAppConfiguration((hostingContext, config) =>
    {
        config
            .SetBasePath(hostingContext.HostingEnvironment.ContentRootPath)
            .AddJsonFile("appsettings.json", true, true)
            .AddJsonFile($"appsettings.{hostingContext.HostingEnvironment.EnvironmentName}.json", true, true)
            .AddJsonFile("ocelot.json")
            .AddEnvironmentVariables();
    })
    .ConfigureServices(s =>
    {
        s.AddOcelot();
        //.AddEureka();
    });

var app = builder.Build();

app.UseRouting();

// 关键:把Ocelot中间件放在路由之后,且不需要额外的端点映射(空项目)
await app.UseOcelot();

app.Run();

2. 修正Ocelot配置的细节问题

你的ocelot.json有两个小问题,可能导致路由解析失败:

  • Port字段应该是整数类型,不是字符串
  • BaseUrl在Docker环境下如果配置不当会导致路由异常,先注释掉测试

调整后的配置:

{
  "Routes": [
    {
      "DownstreamPathTemplate": "/api/TerminologyServices/SearchDrugs/{filter}",
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [
        {
          "Host": "drugservice",
          "Port": 80  // 去掉引号,改为整数
        }
      ],
      "UpstreamPathTemplate": "/TerminologyServices/SearchDrugs/{filter}",
      "UpstreamHttpMethod": [ "Get" ]
    }
  ],
  "GlobalConfiguration": {
    // "BaseUrl": "https://localhost:5003" 先注释掉,Docker环境下后续再根据实际暴露地址配置
  }
}

3. 确保Docker网络连通性

因为你的网关和drugservice都是Docker部署,必须确保它们在同一个Docker网络内,否则网关无法解析drugservice这个主机名:

  • 查看现有Docker网络:docker network ls
  • 启动容器时指定同一网络:docker run --network=你的网络名称 ...
  • 或者创建新网络并将两个容器加入:docker network create 网关服务网络,然后启动容器时加上--network=网关服务网络参数

4. 查看容器日志定位错误

启动网关容器后,立刻查看日志,这是排查问题最直接的方式:

docker logs <你的网关容器ID/名称>

日志里会显示Ocelot加载配置的情况、路由是否生效,以及是否有连接drugservice的错误信息。

5. 本地先验证配置正确性

在Docker部署之前,先在本地调试确认Ocelot配置本身没问题:

  • 将ocelot.json中的Host改为localhost,Port改为你本地运行drugservice的端口
  • 直接启动网关项目,用Postman调用http://localhost:5003/TerminologyServices/SearchDrugs/测试参数,看是否能正常转发到drugservice

6. 确认Docker端口映射正确

启动网关容器时,要确保端口映射正确(.NET 6容器默认暴露80端口):

docker run -p 5003:80 <你的网关镜像名称>

这样外部才能通过http://localhost:5003访问网关。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 15:47:35