【发布时间】:2016-12-31 00:06:03
【问题描述】:
我不知道如何在 MS Bot Framework 中做一件非常简单的事情:允许用户中断任何对话,离开当前对话框并通过键入“quit”、“exit”返回主菜单”或“重新开始”。
这是我的主要对话的设置方式:
public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
{
try
{
if (activity.Type == ActivityTypes.Message)
{
UserActivityLogger.LogUserBehaviour(activity);
if (activity.Text.ToLower() == "start over")
{
//Do something here, but I don't have the IDialogContext here!
}
BotUtils.SendTyping(activity); //send "typing" indicator upon each message received
await Conversation.SendAsync(activity, () => new RootDialog());
}
else
{
HandleSystemMessage(activity);
}
}
我知道如何使用context.Done<DialogType>(this); 终止对话,但在此方法中,我无法访问 IDialogContext 对象,因此无法调用.Done()。
除了在所有对话框的每个步骤中添加检查之外,还有其他方法可以在用户键入特定消息时终止整个对话框堆栈吗?
发布赏金:
我需要一种方法来终止所有 IDialogs,而无需使用我在此处发布的骇人听闻的 hack(这会删除我需要的所有用户数据,例如用户设置和首选项)。
基本上,当用户键入“退出”或“退出”时,我需要退出当前正在进行的 IDialog 并返回到新状态,就好像用户刚刚发起了对话一样。
我需要能够从MessageController.cs, 执行此操作,我仍然无法访问IDialogContext。我似乎拥有的唯一有用数据是Activity 对象。如果有人指出其他方法可以做到这一点,我会很高兴。
解决此问题的另一种方法是在机器人的其他位置而不是 Post 方法中找到其他方法来检查“exit”和“quit”关键字。
但这不应该是在IDialog 的每一步都进行的检查,因为那是太多的代码,而且并非总是可能的(当使用PromptDialog 时,我无法访问用户键入)。
我没有探索的两种可能的方式:
- 不要终止所有当前的
IDialogs,而是开始一个新的对话 与用户(新ConversationId) - 获取
IDialogStack对象并使用它来管理对话框堆栈。
Microsoft 文档对此对象保持沉默,因此我不知道如何获取它。我不在机器人中的任何地方使用允许.Switch() 的Chain 对象,但如果你认为它可以被重写以使用它,它也可以是解决这个问题的方法之一。但是,我还没有找到如何在各种类型的对话框(FormFlow 和普通的IDialog)之间进行分支,这些对话框又调用自己的子对话框等。
【问题讨论】:
标签: c# bots botframework