我不知道如何在MS Bot Framework中完成一件非常简单的事情:允许用户通过键入“quit”、“exit”或“start over”来退出任何对话,离开当前的对话框并返回主菜单。
这是我的主要对话设置方式:
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()
。除了在所有对话的每个步骤中添加检查之外,是否有其他方法可以在用户输入特定消息时终止整个对话堆栈?
我需要一种方法来终止所有
IDialog
,而不使用我发布的荒谬方法(它会删除所有用户数据,而我需要这些数据,例如用户设置和首选项)。基本上,当用户键入“退出”或“退出”时,我需要退出当前正在进行的任何
IDialog
并返回到初始状态,就像用户刚刚启动对话一样。我需要能够从执行此操作,但我仍然无法访问。我唯一有用的数据似乎是对象。如果有人指出其他方法来做到这一点,我将感到高兴。
另一种方法是找到某种其他方式在bot的其他地方检查“退出”和“退出”关键字,而不是在Post方法中进行检查。
但它不应该是在每个
IDialog
的每个步骤中都进行的检查,因为那是太多的代码,甚至不总是可能的(当使用时,我无法访问用户输入的文本)。我没有探索的两种可能的方法:
1.不是终止所有当前的
IDialog
,而是开始一个新的与用户的对话(新的)2.获取对象并对其进行某些操作以管理对话堆栈。
Microsoft文档对此对象保持沉默,因此我不知道如何获取它。我在bot中没有使用允许
.Switch()
的对象,但如果您认为可以重写它来使用它,则可以成为解决此问题的方法之一。然而,我还没有找到如何在各种类型的对话框(和普通的)之间进行分支,这些对话框又调用自己的子对话框等。