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

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)发送请求:
    curl -X POST http://some-selected-address.az:80/api/v2/users/get-token
    
    如果同样返回连接拒绝,说明问题不在Ocelot,需检查:
    • 下游服务是否在指定端口正常启动
    • 下游服务器的防火墙/安全组是否开放对应端口
    • 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中添加:
    {
      "Logging": {
        "LogLevel": {
          "Ocelot": "Debug",
          "Ocelot.Responder": "Debug",
          "Ocelot.DownstreamRouteFinder": "Debug"
        }
      }
    }
    
    通过日志确认Ocelot实际转发的地址、协议是否符合预期,以及连接失败的具体细节。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 13:35:28