我有一个机器人,它用一条只包含附件的消息来回复。当它在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);这基本上可以归结为使用不同的方法来创建回复,而另一个方法则是将回复发回。
现在,问题是,我没有把答案拿回给斯拉克。AppInsight中的诊断学告诉我,在连接器的某个地方发生了这样的事情:
异常类型: System.ArgumentNullException 失败方法: SlackChannel.SlackMapper+d__5.MoveNext 异常消息:值不能为空。参数名称:源 ChannelData:{} 消息:无效的ChannelData
请注意,此诊断中的ChannelData似乎是空的。因此,我从所有这些中得出的结论是,BotConnector处理ChannelData的方式发生了一些变化。我怎么知道我到底做错了什么?
发布于 2016-08-17 16:12:14
实际上,问题在ConnectorClient客户端内部,它剥离了channelData。原因在于它的序列化设置使用了ReadOnlyJsonContractResolver,它跳过了所有只读属性-当然,匿名类中的所有属性都是只读的。
知道了这一点,解决方案非常简单:
reply.ChannelData = JObject.FromObject(new {attachments});
注意JObject的显式使用而不是匿名类。
https://stackoverflow.com/questions/38922207
复制相似问题