我开发了一种在对话开始时会调用基于对话框的提示菜单的机器人。 消息控制器上使用的对话框调用:
await Conversation.SendAsync(activity, () => new Dialogs.CustomBellaHelp());
问题是当我在Bot Emulator提示符下执行对话框时,代码正确解决了对话框选项。 但是,当我通过直接通道提示对话框选项从对话框代码中“泄漏”执行它时,移到“根”对话框,该对话框调用LUIS来管理菜单选项。 关于如何避免这种情况的想法?
谢谢!
答案 0 :(得分:2)
我认为您可能误解了Conversation.SendAsync()
的目的。 MakeRoot委托不是导航到所需对话框的函数。它仅在对话开始时被调用,并用于创建对话的根对话框。如果对话已经在进行中,Conversation.SendAsync()
会将活动发送到堆栈顶部的任何对话框,并且MakeRoot委托将被忽略。您可以在此处阅读有关对话框和对话流程的更多信息:https://docs.microsoft.com/en-us/azure/bot-service/bot-service-design-conversation-flow?view=azure-bot-service-3.0
如果要在对话的中间启动对话框,则应从另一个对话框中而不是从消息控制器中进行。一种典型的方法是使用context.Forward()
:https://docs.microsoft.com/en-us/azure/bot-service/dotnet/bot-builder-dotnet-manage-conversation-flow?view=azure-bot-service-3.0#invoke-the-new-order-dialog
关于Direct Line与仿真器的行为不同的原因,您必须了解,诸如sessionUpdate之类的事件是特定于通道的,并且可能在不同通道上以意外方式运行。