Ocelot网关需手动确保配置加载、下游可达及路径匹配:ocelot.json须正确放置并显式加载,DownstreamHostAndPorts须可解析且端口监听,路径模板斜杠需谨慎处理,UseOcelot()须在UseRouting()后UseEndpoints()前调用并等待完成。

Ocelot 不是“开箱即用”的网关,它依赖配置驱动、对 ASP.NET Core 生命周期敏感,且默认不启用 HTTPS 转发或跨域——直接照抄示例常卡在 404、500 或连接拒绝。关键不在“会不会装”,而在“配置是否被加载”“下游服务是否可达”“路径是否大小写/斜杠匹配”。
ocelot.json 文件必须被正确加载且热重载生效
很多人把 ocelot.json 放错位置(比如放进了 wwwroot),或没设为“始终复制”。它必须在运行时能被 IConfiguration 读到:
- 文件放在项目根目录,属性“复制到输出目录”设为“始终复制”
-
Program.cs中必须显式调用builder.Configuration.AddJsonFile("ocelot.json", optional: false, reloadOnChange: true) - 不能只靠
AddOcelot()就以为配置自动加载——它只注册服务,不读配置 - 修改
ocelot.json后,控制台日志应出现Ocelot configuration changed,否则 reloadOnChange 失效
DownstreamHostAndPorts 的 Host 必须可解析,Port 必须已监听
Ocelot 不做服务发现,它直连下游地址。常见错误是 Host 写成 localhost 却在容器中运行网关,或下游服务还没启就跑网关:
- 本地开发时,
Host用localhost没问题;但若网关和下游分别在不同 Docker 容器里,Host必须是容器名或网络别名(如orderapi),不能是localhost - 确认下游服务端口真实监听:
curl http://localhost:7209/health或netstat -ano | findstr :7209 -
DownstreamScheme写https但下游只开 HTTP,会报Connection refused或 TLS 握手失败 - 如果下游是自签名 HTTPS,需在网关项目中添加
builder.Services.Configure<httpclientoptions>(options => options.AllowAutoRedirect = false);</httpclientoptions>并手动处理证书验证(生产环境应换正式证书)
UpstreamPathTemplate 和 DownstreamPathTemplate 的斜杠行为易踩坑
Ocelot 对路径末尾斜杠极其敏感,{everything} 不会自动补/或去/,它原样拼接:
- 若
UpstreamPathTemplate是/good/{everything},请求GET /good/api/hello→ 下游收到路径是/api/hello - 但若
DownstreamPathTemplate是/api/{everything},而下游控制器路由是[Route("api/[controller]")],实际访问的是/api/api/hello,导致 404 - 建议统一:上游带前缀(如
/good/),下游留空(DownstreamPathTemplate: "/"),再靠下游自身路由处理 - 避免在模板里混用通配符和固定路径,例如
/good/{id}/detail+{everything}会冲突
UseOcelot() 必须在 UseRouting() 之后、UseEndpoints() 之前调用
顺序错会导致中间件链断开,所有请求绕过网关直接 404:
- 正确顺序:
app.UseRouting(); app.UseOcelot().Wait(); app.UseEndpoints(...); -
UseOcelot()返回Task,必须Wait()或await,否则网关未初始化就进入下一中间件 - .NET 6+ 默认模板已移除
Startup.cs,全部逻辑在Program.cs,别去找ConfigureServices和Configure分离写法 - 若用了
UseHttpsRedirection(),确保它在UseOcelot()前,否则 HTTPS 重定向可能干扰下游协议协商
Ocelot 的核心复杂点从来不是语法,而是它的“被动性”:它不主动探活、不自动修复路径、不兜底证书错误。你得亲手确认每个环节的输入输出——配置文件是否加载、DNS 是否通、下游响应头是否含 Content-Length、甚至 BaseUrl 是否影响重定向 Location 头。漏掉任意一环,它就静默失败。


















