2016-08-12 56 views
0

我有一个机器人回复仅包含附件的消息。当它在Slack上工作时,它使用Slack附件格式相当严重,因此我必须使用ChannelData属性。无法发送定制的Slack消息与Bot连接器的版本3

在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诊断给我看在连接器的东西,类似的地方出现这种情况:

异常类型信息:System.ArgumentNullException

失败的方法:SlackChannel.SlackMapper + d__5.MoveNext

异常消息:值不能空值。参数名:源

ChannelData:{}

消息:无效ChannelData

请注意,ChannelData在此诊断似乎是空的。所以我从中得到的是,BotConnector处理ChannelData的方式发生了变化。我怎样才能知道我究竟做错了什么?

回答

0

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

知道的是,该解决方案很简单:

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

注意明确使用JObject而不是匿名类。

+0

添加了一个Gist求助https://gist.github.com/phaniav/cf03f8f62ee7c6dc891486d8df893794 – phani