You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:08:39