如何使用.NET客户端消费Salesforce变更数据捕获事件
.NET消费Salesforce Change Data Capture事件实操步骤
一、获取服务总线地址与连接凭证
- 登录Salesforce Setup,搜索Change Data Capture进入配置页,确认目标对象的事件已启用
- 进入Streaming API相关配置(或直接在Change Data Capture页点击目标事件的订阅入口):
- 服务总线地址:即CometD端点URL,格式为
wss://<你的Salesforce实例域名>/cometd/<API版本号>,实例域名可从Setup的Company Information中获取(如na123.salesforce.com),API版本建议选最新稳定版(如59.0) - 连接凭证:通过OAuth 2.0用户名密码流获取:
- 在Setup中创建Connected App,启用OAuth权限,勾选
api、web等范围,记录Client ID和Client Secret - 用.NET发起POST请求到
https://<实例域名>/services/oauth2/token,参数包括:grant_type=password、client_id=<你的Client ID>、client_secret=<你的Client Secret>、username=<Salesforce账号>、password=<账号密码+安全令牌> - 响应中的
access_token就是后续连接所需的凭证
- 在Setup中创建Connected App,启用OAuth权限,勾选
- 服务总线地址:即CometD端点URL,格式为
二、.NET端订阅实现
Salesforce CDC基于CometD协议,直接使用NuGet包CometD.Client即可对接,核心代码示例:
using CometD.Client; using CometD.Client.Transport; using Newtonsoft.Json.Linq; using System.Threading.Tasks; var cometdUrl = "wss://na123.salesforce.com/cometd/59.0"; var accessToken = "<你的OAuth访问令牌>"; var cdcTopic = "/data/AccountChangeEvent"; // 替换为目标对象的ChangeEvent主题 var client = new BayeuxClient(cometdUrl, new LongPollingTransport(null)); client.Headers.Add("Authorization", $"Bearer {accessToken}"); // 发起握手连接 await client.HandshakeAsync(); // 订阅CDC事件 client.Subscribe(cdcTopic, message => { var eventData = JObject.Parse(message.Data.ToString()); var changeHeader = eventData["ChangeEventHeader"]; var changeType = changeHeader["changeType"].ToString(); var recordIds = changeHeader["recordIds"]; // 按需处理变更数据 Console.WriteLine($"[{changeType}] 变更记录ID:{string.Join(",", recordIds)}"); Console.WriteLine("完整事件数据:\n" + eventData.ToString()); }); // 保持连接(控制台程序示例,后台服务可托管为长期运行任务) Console.WriteLine("已订阅CDC事件,按任意键退出..."); Console.ReadLine(); // 断开连接 await client.DisconnectAsync();
三、关键注意事项
- 配置Connected App的信任IP范围:如果你的.NET服务有固定公网IP,需添加到Connected App的Trusted IP Range中,避免连接被拦截
- 重连逻辑:CometD连接可能因网络波动断开,可通过监听
client.Connected、client.Disconnected事件实现自动重连 - 事件结构查询:可通过Salesforce Workbench的REST Explorer调用
/services/data/v<API版本>/sobjects/<对象名称>ChangeEvent/describe,获取完整的事件字段结构
内容的提问来源于stack exchange,提问作者OpenStack
相关产品推荐
相关产品推荐

