Bot 可以处理来自 Skype 桌面应用程序的请求,但不能处理来自 Skype 商店应用程序的请求
Bot can handle request from Skype desktop app, but not from Skype store app
我使用 MS 机器人框架编写了一个小型聊天机器人。我添加了 Skype 和 Web 频道,并使用最小的即用即付计划在 Azure 上托管机器人。当我使用 Skype 桌面应用程序时,机器人本身运行良好,无论是通过网络聊天还是在 Skype 对话中,无论是直接(一对一聊天)还是在群组中。
不幸的是,当使用从 Microsoft 商店安装的 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 是从 bot 框架示例中提取的,没有改变,并且如前所述,bot 在网络聊天和 "regular" Skype 桌面应用程序中运行良好.即使在与桌面应用程序上的一些用户和商店应用程序上的一些用户的群聊中,使用桌面应用程序的用户也可以按预期与机器人交互,而商店应用程序用户只会触发错误。
这里明显的问题当然是:从机器人的角度来看,这两个 Skype 应用程序有何不同(以及为什么),我该如何处理?
编辑:事实证明,Skype 桌面应用程序 将 activity.From.Name 属性 设置为用户名,而 Skype 商店应用 没有。平均部分是,两者的 channelid 是相同的("skype",显然)。
感谢@EricDahlvang 的评论,我注意到一开始错误不是上面提到的行,尽管调用堆栈专门给出了这一行号。错误发生在稍后,当我尝试使用 "activity.From.Name" 时。事实证明,常规 Skype 设置此 属性 以匹配用户显示名称,而 Skype 商店应用程序则没有,并且 returns null.
我使用 MS 机器人框架编写了一个小型聊天机器人。我添加了 Skype 和 Web 频道,并使用最小的即用即付计划在 Azure 上托管机器人。当我使用 Skype 桌面应用程序时,机器人本身运行良好,无论是通过网络聊天还是在 Skype 对话中,无论是直接(一对一聊天)还是在群组中。
不幸的是,当使用从 Microsoft 商店安装的 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 是从 bot 框架示例中提取的,没有改变,并且如前所述,bot 在网络聊天和 "regular" Skype 桌面应用程序中运行良好.即使在与桌面应用程序上的一些用户和商店应用程序上的一些用户的群聊中,使用桌面应用程序的用户也可以按预期与机器人交互,而商店应用程序用户只会触发错误。
这里明显的问题当然是:从机器人的角度来看,这两个 Skype 应用程序有何不同(以及为什么),我该如何处理?
编辑:事实证明,Skype 桌面应用程序 将 activity.From.Name 属性 设置为用户名,而 Skype 商店应用 没有。平均部分是,两者的 channelid 是相同的("skype",显然)。
感谢@EricDahlvang 的评论,我注意到一开始错误不是上面提到的行,尽管调用堆栈专门给出了这一行号。错误发生在稍后,当我尝试使用 "activity.From.Name" 时。事实证明,常规 Skype 设置此 属性 以匹配用户显示名称,而 Skype 商店应用程序则没有,并且 returns null.