使用Botframework C#与DirectLineJS时AdaptiveCard丢失actions节点问题
解决DirectLine传输中AdaptiveCard Actions节点丢失的问题
我之前也碰到过一模一样的情况——用Bot Framework C#搭的机器人,通过DirectLineJS和客户端通信时,AdaptiveCard里的actions节点莫名其妙就没了。结合我的排查经验,给你几个实用的解决方向:
1. 先确认AdaptiveCard版本兼容性
DirectLine和Bot Connector对AdaptiveCard的版本有严格要求,旧版本的卡片结构很容易被中间组件过滤:
- 确保服务端生成的卡片指定了v1.0及以上的稳定版本,最好是v1.4+,在Card的
$schema和version字段明确声明:{ "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", "type": "AdaptiveCard", "version": "1.4", "body": [/* 你的卡片内容 */], "actions": [/* 动作定义 */] } - 同步检查客户端DirectLineJS使用的AdaptiveCards渲染库版本,必须和服务端版本匹配,版本不兼容是节点丢失的高频原因。
2. 规范服务端消息序列化方式
别手动拼接JSON字符串!用官方提供的AdaptiveCard类构建卡片才是正确姿势,能避免序列化错误导致节点丢失:
// 用AdaptiveCard类构建卡片 var adaptiveCard = new AdaptiveCard(new AdaptiveSchemaVersion(1, 4)) { Body = { new AdaptiveTextBlock { Text = "这是测试卡片" } }, Actions = { new AdaptiveOpenUrlAction { Title = "打开链接", Url = new Uri("https://example.com") } } }; // 封装为Attachment发送 var attachment = new Attachment { ContentType = AdaptiveCard.ContentType, Content = adaptiveCard }; var reply = MessageFactory.Attachment(attachment); await turnContext.SendActivityAsync(reply, cancellationToken);
避免用自定义序列化器,Bot Framework默认的Newtonsoft.Json配置是经过兼容测试的,手动修改很容易出问题。
3. 排查中间组件的过滤规则
如果你的Bot和DirectLine之间有代理、网关或者自定义中间件,这些组件可能会误过滤actions节点:
- 检查防火墙/API网关是否设置了字段白名单,确认
actions不在被过滤的列表里; - 排查Bot端的自定义中间件,有没有对消息内容进行裁剪、修改的逻辑,比如某些日志中间件可能会意外改动消息结构。
4. 开启调试日志追踪传输环节
通过日志可以精准定位actions节点是在哪个环节丢失的:
- 在DirectLineJS客户端开启调试日志,查看浏览器控制台里的消息详情:
const directLine = window.WebChat.createDirectLine({ token: '你的DirectLine令牌', logger: { log: (...args) => console.log('DirectLine日志:', args) } }); - 对比服务端发送的原始消息和客户端收到的消息,就能确定是服务端序列化问题、DirectLine传输问题,还是客户端解析问题。
5. 检查SubmitAction的格式合法性
如果只是SubmitAction节点丢失,大概率是data字段格式不对:
- SubmitAction的
data必须是JSON对象,不能是原始字符串,否则会被解析器判定为无效而丢弃:"actions": [ { "type": "Action.Submit", "title": "提交表单", "data": { "actionType": "submit", "formData": { "name": "test" } } } ]
内容的提问来源于stack exchange,提问作者Eder Cardoso
相关产品推荐
相关产品推荐

