.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
相关产品推荐
相关产品推荐

