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

使用Ocelot作为API网关时,本地定义的/ping路由无法访问且报错UnableToFindDownstreamRouteError求助

使用Ocelot作为API网关时,本地定义的/ping路由无法访问且报错UnableToFindDownstreamRouteError求助

兄弟,我太懂你这个坑了!之前用Ocelot的时候也栽过一模一样的跟头,问题根源就出在中间件的注册顺序上!

你看现在的代码里,app.UseOcelot().Wait()是放在了本地路由MapGet("/ping")和MapControllers()之后的,ASP.NET Core的中间件是按注册顺序执行的——先注册的先处理请求。这就导致请求过来时,Ocelot会先拦截所有请求,去匹配它自己的下游路由配置,而你的/ping是本地定义的路由,根本不在Ocelot的路由规则里,所以直接抛出了UnableToFindDownstreamRouteError,根本轮不到后面的本地路由去处理!

解决方法很简单,把app.UseOcelot().Wait()的位置提前,放到所有本地路由、MapControllers这些注册之前,具体调整后的代码如下:

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();
app.UseAuthentication();
app.UseAuthorization();

// 核心调整:把Ocelot中间件移到本地路由之前
app.UseOcelot().Wait();

// 现在Ocelot匹配不到的请求,会流转到这里的本地路由处理
app.MapGet("/ping", () => {
    Console.WriteLine("Ping received");
    return Results.Ok("pong");
});

app.MapControllers();
app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

另外还要提醒你两个排查点:

  • 检查你的ocelot.json配置文件,确保里面没有把/ping配置成下游服务的路由规则,如果有,Ocelot还是会尝试把请求转发到下游服务,而不是走本地路由。
  • 如果你的Ocelot配置里有全局路由前缀或者其他通配符匹配规则,要确保这些规则不会意外匹配到/ping,导致Ocelot还是去走下游路由逻辑。

这样调整之后,再访问localhost:5000/ping,Ocelot会先检查自己的路由配置,发现没有匹配的下游路由,就会把请求传递给后面的本地/ping路由,就能正常返回pong了!

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 08:18:00