CardAction.ChannelData 的目的是什么?

What is the purpose of CardAction.ChannelData?

我将 .NET BotFramework v4 与 Azure Bot 服务结合使用,并在消息中呈现 HeroCard 和一组按钮,如下所示:

var card = new HeroCard
{
    Buttons = new List<CardAction>()
    {
        new()
        {
            Type = ActionTypes.PostBack,
            Value = "42",
            Title = "The answer"
        },
        new()
        {
            Type = ActionTypes.PostBack,
            Value = "0",
            Title = "Wrong answer"
        }
    }
};
var message = MessageFactory.Text(message.Message);
message.Attachments.Add(heroCard.ToAttachment());

我注意到 CardAction 有一个 ChannelData 属性。我希望用它来为 Slack 用户自定义按钮的样式。

然而,this answer表明这是不可能的。如果我想为单个按钮设置样式,听起来我必须放弃这种方法,只需为 IMessageActivity.

覆盖整个 ChannelData

现在还是这样吗?如果是这样,Azure 机器人服务如何利用 CardAction.ChannelData?它有什么用?

ChannelData 是将特定于频道的信息从机器人发送到频道,并最终发送到提供商(例如 Slack)的方式,这不包含在 Bot Framework 架构中。

但是,将信息转换为通道所需内容的方式特定于适配器实现。

有一种 SlackAdapter in Bot Framework SDK that has a the SendActivitiesAsync() method, (as any other adapter) that currently uses the SlackHelper.ActivityToSlack 方法可以创建 Slack 需要的任何东西。

您可以创建自己的 HaackedSlackAdapter 继承自 SlackAdapter 并覆盖 SendActivitiesAsync() 以准确发送您需要的内容。

然后你只需要从机器人发送,在 ChannelData 任何你需要发送到 Slack 的东西,这样你的新适配器就可以将它“翻译”成 Slack 术语。

因此,要回答您答案的另一部分,您必须创建一条完整的新消息以发送到 Slack,或者可能只是调整 SlackHelper.

的结果

我已经尝试了每个频道的每个卡片动作属性。据我所知,从未使用过频道数据 属性。

当我们考虑 Bot Framework 模式的性质时,这对您来说可能有意义。 Bot Framework 背后的最初想法是有一种方法来构建一个可以在许多不同渠道上工作的机器人。这在处理普通文本消息时非常有效,但不同的渠道对于如何处理附件和交互式消息等内容有着截然不同的想法。 Bot Framework 团队提出了一种叫做“卡片”的东西来概括在不同渠道中找到的 UI 对象,例如 Facebook Messenger 的“模板”和 Telegram 的“内联键盘”。为了做到这一点,团队必须考虑在所有渠道中发现的许多不同的能力和可能性。由于在提前设计模式时很难预测卡片动作可能需要哪些能力,因此开发人员宁愿谨慎行事并为卡片动作提供额外属性也是可以理解的,即使他们不确定是否这样做被使用。

因此,卡片操作的通道数据很可能只是 Bot Framework 架构原始规范的遗留物。