简介
当前,我正在尝试使用Microsoft Bot Framework v4创建Bot Framework应用程序。
程序结构
我们当前有以下设置:
bot类的根名为:SubDialogBotBot
在SubDialogBot
中,我们创建了一个名为ParentDialog
的新对话框。该对话框负责对特定的Intent做出反应。
然后我们从ParentDialog
的{{1}}开始一个新对话框。该子对话框负责根据ChildDialog
传递的参数向用户提出问题。
此问题完成后,我们要返回ParentDialog
并继续进行操作。
在此示例中,我们要从各种不同的意图中重用ParentDialog
,因为此处的代码完全相同。唯一改变的是必须向用户提出的问题。
问题
ChildDialog
完成后,“流”将永远不会返回到ChildDialog
。
我们还尝试将ParentDialog
ID设置为特定对象后再打开Dialog,然后使用ChildDialog
中的Context.BeginDialog(....)进行调用。但是,因为显然该对话框是添加到ChildDialog
而不是ParentDialog
的,所以无法通过ID找到它。
Github存储库重现问题
答案 0 :(得分:2)
首先,这是一个非常准备好的问题,谢谢您……特别是分享代码。
现在,好消息是我认为您的对话框没有问题。问题实际上出在your bot's OnTurnAsync
中。您只会在BeginDialogAsync
上呼叫ParentDialog
。每个活动都会通过您的OnTurnAsync
进入,这意味着您有责任处理重新进入对话框堆栈的过程。这意味着您需要检查一个活动对话框,如果有一个活动对话框,则需要致电ContinueDialogAsync
才能从讨论中断的地方继续。这是您当前的OnTurnAsync
,其中添加了额外的支票:
public async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken))
{
// Create a dialog context
var dc = await Dialogs.CreateContextAsync(turnContext);
// Handle Message activity type, which is the main activity type for shown within a conversational interface
// Message activities may contain text, speech, interactive cards, and binary or unknown attachments.
// see https://aka.ms/about-bot-activity-message to learn more about the message and other activity types
if (turnContext.Activity.Type == ActivityTypes.Message)
{
// If there's no active dialog, begin the parent dialog
if(dc.ActivDialog == null)
{
await dc.BeginDialogAsync(nameof(ParentDialog));
}
else
{
await dc.ContinueDialogAsync();
}
// Save the new turn count into the conversation state.
await _accessors.ConversationState.SaveChangesAsync(turnContext);
}
else
{
await turnContext.SendActivityAsync($"{turnContext.Activity.Type} event detected");
}
}