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

