无法使用 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。
我有一个机器人回复一条仅包含附件的消息。当它在 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。