ocelot在.net 6+中已基本弃用,官方推荐迁移到yarp;新建项目不应选用ocelot,因其不支持原生minimal hosting、缺失grpc透传、热重载能力弱且社区维护停滞。

直接说结论:Ocelot 在 .NET 6+ 中已基本弃用,官方明确推荐迁移到 YARP;如果你正在新建项目,别配 Ocelot,它不支持原生 minimal hosting、缺失 gRPC 透传、热重载配置能力弱,且社区维护已停滞。
为什么 Ocelot 的 configuration.json 总是不生效
Ocelot 依赖 IOcelotConfigurationProvider 加载 JSON 配置,但它的默认实现对路径敏感、不自动监听文件变更,且在 .NET 6+ 的 WebApplication.CreateBuilder 流程中容易被中间件顺序覆盖。
- 常见错误现象:
DownstreamPathTemplate写对了却 404,或AuthenticationOptions配置后Authorization中间件完全没触发 - 根本原因:Ocelot 必须在
UseRouting()之后、UseEndpoints()之前调用UseOcelot(),且不能和MapControllers()混用 - 实操建议:改用内存配置(
AddOcelot().AddSingleton<iocelotconfigurationprovider customjsonfileconfigprovider>()</iocelotconfigurationprovider>),或直接跳过——YARP 的AddReverseProxy()原生支持IConfiguration绑定和ChangeToken.OnChange热重载
YARP 替代 Ocelot 的最小可行配置
YARP 不需要单独的配置文件,所有路由逻辑可写在 C# 代码里,也兼容 appsettings.json。关键是把 RouteConfig 和 ClusterConfig 对齐。
- 必须注册的服务:
builder.Services.AddReverseProxy().LoadFromConfig(builder.Configuration.GetSection("ReverseProxy")) - 配置节示例(
appsettings.json):{ "ReverseProxy": { "Routes": { "api1": { "ClusterId": "service1", "Match": { "Path": "/api/foo/{**catch-all}" } } }, "Clusters": { "service1": { "Destinations": { "service1/destination1": { "Address": "http://localhost:5001/" } } } } } } - 注意点:YARP 默认不转发原始 Host 头,如需保留,加
ForwarderOptions并设置CopyXForwardedForHeader = true和PreserveHostHeader = true
签名验证必须自己写,SDK 不等于网关逻辑
阿里云 API 网关要求后端服务校验 X-Signature 和 X-Sdk-Date,但 Ocelot/YARP 都不内置该能力——你得在中间件里手动做。
- 典型错误:把
apigateway-signature库直接塞进 Ocelot 的DelegatingHandler,结果签名头被提前消费、body 流不可读 - 正确做法:用
EnableBuffering()+ReadAsStringAsync()提前读取 body,再调用Signer.CheckSignature();注意Content-Length和Transfer-Encoding处理差异 - 性能影响:签名验证是 CPU 密集型操作,别在每请求里 new
Signer,应注册为 singleton,并复用HMACSHA256实例
防火墙和容器网络常让本地调试失败
YARP 默认监听 http://localhost:5000,但 Docker 容器内访问宿主服务时,localhost 指向容器自身,不是宿主机。
- Windows/macOS Docker Desktop:用
host.docker.internal替代localhost;Linux 需额外加--add-host=host.docker.internal:host-gateway - Windows 防火墙:若用非标准端口(如 5001),必须手动添加入站规则——选“自定义规则”,协议选 TCP,本地端口填具体数字,操作选“允许连接”
- 容易忽略的点:ASP.NET Core 默认只监听
http://+:80,若 YARP 转发到 HTTPS 后端,需显式启用HttpClientHandler.ServerCertificateCustomValidationCallback跳过证书校验(仅开发环境)
真正卡住人的从来不是“怎么配路由”,而是签名头被中间件吞掉、容器网络 DNS 解析失败、或防火墙静默丢包——这些细节不打日志根本看不到。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











