我使用MS-bot框架编写了一个小型聊天机器人。我添加了Skype和Web频道,并在Azure上以最小的现收现付计划托管机器人。当我使用Skype桌面应用程序时,无论是通过网络聊天还是Skype对话,无论是直接(1on1聊天)还是分组,机器人本身都能很好地工作。
不幸的是,当使用从微软商店安装的Skype应用程序时,什么都不起作用。。。向机器人发送消息(在直接聊天和群中)总是会从我的机器人中产生HTTP 500响应。深入挖掘它会导致抛出一个简单的NullReferenceException,显然是在我的对话框处理程序的第一行中(见下文):调用堆栈指向这一行,但错误后来发生了,见下文:
namespace MyBot.Dialogs {
[Serializable]
public class RootDialog: IDialog<IMessageActivity> {
public Task StartAsync(IDialogContext context) {
context.Wait(MessageReceivedAsync);
return Task.CompletedTask;
}
private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result) {
// call stack pointed to next line
Activity activity = await result as Activity;
//... some unproblematic stuff
string username = activity.From.Name;
// the next line was the actual problem:
if(username.Contains(" "))
//...
}
}
}
这部分代码以及完整的MessagesController都是在没有改变机器人程序框架示例的情况下获得的,如前所述,机器人程序在网络聊天和"常规"Skype桌面应用程序中运行良好。即使在与桌面应用程序和商店应用程序上的一些用户的群聊中,使用桌面应用程序的用户也可以按预期与机器人进行交互,而商店应用程序用户只会触发错误。
这里显而易见的问题当然是:从机器人的角度来看,这两款Skype应用程序有何不同(以及为什么不同),我该如何处理
编辑:事实证明,Skype桌面应用程序设置活动。From.Name属性设置为用户名,而Skype商店应用则不设置。最重要的是,两者的channelid是相同的(显然是"skype")。
感谢@EricDahlwang的评论,我注意到错误最初不是上面提到的行,尽管调用堆栈专门给出了这个行号。后来,当我尝试使用"activity.From.Name"时,错误发生了。事实证明,常规Skype将此属性设置为与用户的显示名称匹配,而Skype商店应用程序则不匹配,并返回null。