无法使用 Bot Connector 版本 3 发送自定义 Slack 消息

Can't send custom Slack Message with version 3 of Bot Connector

我有一个机器人回复一条仅包含附件的消息。当它在 Slack 上运行时,它会大量使用 Slack 附件格式,因此我必须使用 ChannelData 属性.

在 BotConnector 版本 1 中,代码是这样的

        var reply = message.CreateReplyMessage();
        reply.Attachments = new List<Attachment>();
        var attachments = new List<object>(); //Slack-formatted attachments
        //filling attachments...
        reply.ChannelData = new {attachments};

它奏效了。现在,在版本 3 中,代码已更改为

        var reply = activity.CreateReply();
        reply.Attachments = new List<Attachment>();
        var attachments = new List<object>(); //Slack-formatted attachments
        //filling attachments...
        reply.ChannelData = new {attachments};

        var connector = new ConnectorClient(new Uri(activity.ServiceUrl));
        await connector.Conversations.ReplyToActivityAsync(reply);

这基本上可以归结为使用不同的方法创建回复,然后使用另一种方法发回回复。

现在,问题是我没有收到 Slack 的回复。 AppInsight 中的诊断告诉我在连接器的某处发生了这样的事情:

Exception type: System.ArgumentNullException

Failed method: SlackChannel.SlackMapper+d__5.MoveNext

Exception Message: value cannot be null. Parameter name: source

ChannelData: {}

message: Invalid ChannelData

请注意,此诊断中的 ChannelData 似乎是空的。所以我从所有这些中收集到的是 BotConnector 处理方式发生了一些变化 ChannelData。我怎样才能找出我到底做错了什么?

实际上问题出在 ConnectorClient 客户端内部,它剥离了 channelData。原因在于 its serialization settings 使用 ReadOnlyJsonContractResolver,它会跳过所有只读属性 - 当然匿名 class 中的所有属性都是只读的。

知道了,解决方法就很简单了:

reply.ChannelData = JObject.FromObject(new {attachments});

请注意显式使用 JObject 而不是匿名 class。