ocelot在.net 6+中已事实弃用,yarp是唯一推荐路径;其配置不生效因默认iocelotconfigurationprovider路径写死、不监听变更且易被覆盖,而yarp原生支持iconfiguration绑定与热重载。

新建项目别碰 Ocelot,它在 .NET 6+ 中已事实弃用;YARP 是唯一推荐路径。
为什么 ocelot.json 总是不生效
Ocelot 不是“读完 JSON 就跑”,它依赖 IOcelotConfigurationProvider 加载配置,而默认实现有三处硬伤:路径写死为 ocelot.json、不监听文件变更、且在 WebApplication.CreateBuilder 流程中极易被后续注册覆盖。
- 常见现象:
DownstreamPathTemplate没写错却返回 404;AuthenticationOptions配了但Authorization中间件完全没触发 - 根本原因:Ocelot 必须在
UseRouting()之后、UseEndpoints()之前调用UseOcelot(),且不能和MapControllers()混用 - 临时解法(仅限维护旧项目):用
AddSingleton<iocelotconfigurationprovider customjsonfileconfigprovider>()</iocelotconfigurationprovider>替换默认提供者 - 正确方向:直接跳过——YARP 的
AddReverseProxy()原生支持IConfiguration绑定和ChangeToken.OnChange热重载
YARP 最小可运行配置怎么写
YARP 不需要独立配置文件,但必须对齐 RouteConfig 和 ClusterConfig,且服务注册顺序不能错。
- 必须注册:
builder.Services.AddReverseProxy().LoadFromConfig(builder.Configuration.GetSection("ReverseProxy")) -
appsettings.json中的ReverseProxy节点必须包含Routes和Clusters两个一级键,缺一不可 - 默认不转发原始
Host头,如需保留,得显式配置ForwarderOptions并设PreserveHostHeader = true - 路由匹配失败时不会报错,只会静默 404——检查
Match.Path是否带前导/,以及ClusterId是否与Clusters下的 key 完全一致(区分大小写)
JWT 验证透传为什么下游收不到用户信息
Ocelot 和 YARP 都不做鉴权,只做转发。用户身份能否透传,取决于上游认证中间件是否生效、头字段是否被改写、下游是否主动读取。
- Ocelot 场景下:
AddAuthentication().AddJwtBearer("Bearer", ...)必须在AddOcelot()之前注册;ocelot.json中的"AuthenticationProviderKey": "Bearer"必须与AddJwtBearer()的 name 参数完全一致 - YARP 场景下:认证逻辑完全由你控制,
AddAuthentication()位置自由,但必须确保它在UseRouting()之后、UseReverseProxy()之前 - 两者都不自动透传
ClaimsPrincipal到下游——下游应直接读HttpContext.User,而非依赖X-User-Id这类头;若必须透传头,得自己写中间件或 DelegatingHandler - 典型坑:签名验证中间件(如阿里云
X-Signature)提前消费了 request body 流,导致后续中间件读不到内容
签名验证(如阿里云 X-Signature)必须自己写中间件
Ocelot 和 YARP 都不内置任何签名算法,SDK 提供的 apigateway-signature 库也不能直接塞进网关管道里用。
- 阿里云要求校验
X-Signature、X-Sdk-Date、X-Ca-Nonce等头,并验证 body 内容哈希——这些逻辑必须在反向代理前完成 - 不能把签名验证放在
DelegatingHandler或自定义HttpMessageInvoker中,因为此时请求流已被消费,下游服务拿不到原始 body - 正确做法:在
UseRouting()后、UseReverseProxy()前插入一个中间件,用Request.EnableBuffering()复制流,校验通过后再交由 YARP 转发 - 注意:
EnableBuffering()会增加内存开销,大文件场景需限制bufferSize或改用流式校验
最易被忽略的一点:YARP 的 LoadFromConfig() 不会自动重载配置变更,哪怕你用了 ChangeToken.OnChange 监听,也得手动触发 ProxyConfigManager.ReloadAsync();Ocelot 的热重载更是伪命题——它的“重载”本质是重建整个中间件管道,会导致连接中断。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











