Ocelot网关指定端口无法正常工作问题求助
问题:Ocelot网关请求下游服务出现ECONNREFUSED错误
使用Ocelot中间件,指定完整DNS地址和端口发送请求时,Postman返回ECONNREFUSED错误,更换端口后问题依旧。已配置ocelot.json、ocelot.developments.json,且在Routes目录下添加了ocelot.some-api.json和ocelot.SwaggerEndPoint.json,问题仍未解决。
相关配置与代码
ocelot.json配置文件
{ "GlobalConfiguration": { "BaseUrl": "https://localhost:5544" }, "Routes": [ { "UpstreamPathTemplate": "/gw/token", "UpstreamHttpMethod": [ "POST" ], "DownstreamPathTemplate": "/api/v2/users/get-token", "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "some-selected-address.az", "Port": 80 } ], "SwaggerKey": "biosign" } ], "SwaggerEndPoints": [ { "Key": "biosign", "TransformByOcelotConfig": true, "Config": [ { "Name": "Biosign API", "Version": "v1", "Url": "http://some-selected-address.az/swagger/v1/swagger.json" } ] } ] }
Program.cs代码
using gateway_api.Config; using MMLib.SwaggerForOcelot.DependencyInjection; using Ocelot.DependencyInjection; using Ocelot.Middleware; var builder = WebApplication.CreateBuilder(args); builder.Services.AddCors(options => { options.AddPolicy("CORSPolicy", builder => builder.AllowAnyMethod().AllowAnyHeader().AllowCredentials().SetIsOriginAllowed((hosts) => true)); }); string routesDirectory = "Routes"; builder.Configuration.AddOcelotWithSwaggerSupport(options => { options.Folder = routesDirectory; }); builder.Services.AddOcelot(builder.Configuration); builder.Services.AddSwaggerForOcelot(builder.Configuration); builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(options => { options.ResolveConflictingActions(p => p.FirstOrDefault()); }); var app = builder.Build(); if (app.Environment.IsDevelopment()) { app.UseSwagger(); } #region Remove in future app.UseDeveloperExceptionPage(); #endregion app.UseAuthorization(); app.UseSwaggerForOcelotUI(options => { options.PathToSwaggerGenerator = "/swagger/docs"; options.ReConfigureUpstreamSwaggerJson = AlterUpstream.AlterUpstreamSwaggerJson; }); app.UseOcelot().Wait(); app.MapControllers(); //app.UseCors("CORSPolicy"); app.Run();
排查思路与解决建议
1. 优先验证下游服务可达性
绕过Ocelot直接测试下游地址,确认问题根源:
- 用
curl(Linux/macOS)或Invoke-WebRequest(PowerShell)发送请求:
如果同样返回连接拒绝,说明问题不在Ocelot,需检查:curl -X POST http://some-selected-address.az:80/api/v2/users/get-token- 下游服务是否在指定端口正常启动
- 下游服务器的防火墙/安全组是否开放对应端口
- DNS解析是否正确:执行
nslookup some-selected-address.az确认返回IP为下游服务真实地址
2. Ocelot配置校验
- 确认
DownstreamScheme匹配下游服务协议:如果下游用HTTPS,需改为https,对应端口通常为443 - 检查Routes目录下的配置文件:确保没有与
ocelot.json重复的上游路径模板,避免路由冲突 - 验证开发环境配置:
ocelot.developments.json中的下游地址/端口是否覆盖了主配置,导致实际转发地址错误
3. 网关程序中间件与日志调整
- 修正中间件顺序:将
UseCors移到UseOcelot之前,避免跨域配置失效(虽不直接导致连接拒绝,但属于规范配置):app.UseCors("CORSPolicy"); app.UseOcelot().Wait(); - 开启Ocelot详细日志,在
appsettings.json中添加:
通过日志确认Ocelot实际转发的地址、协议是否符合预期,以及连接失败的具体细节。{ "Logging": { "LogLevel": { "Ocelot": "Debug", "Ocelot.Responder": "Debug", "Ocelot.DownstreamRouteFinder": "Debug" } } }
内容的提问来源于stack exchange,提问作者Farid Huseynli
相关产品推荐
相关产品推荐

