【问题标题】:Unable to switch between dialogs in Bot Framework v4无法在 Bot Framework v4 中的对话框之间切换
【发布时间】:2018-10-22 19:53:07
【问题描述】:

我在 Bot Framework v4 中从一个对话框移动到另一个对话框时遇到了一些问题。我想要完成的是从对话 X 移动到 Y,然后从 Y 回到 X。

例如,我有一个 GetShoppingCart 对话框,我想切换到 FindRecipe 对话框。我尝试添加 FindRecipe 对话框 (dc.Dialogs.Add(FindRecipeDialog.Id, recipe_dialog);) 到 GetShoppingCart 的 瀑布,但只要我在 FindRecipe 对话框中执行相同操作,就会出现无限循环。 这很麻烦,因为我需要添加这一行才能访问对话框的目标 ID。否则被 Replace 方法调用时将无法识别(await dc.Replace(FindRecipeDialog.Id, dialogArgs);)。

然后我尝试将对话框对象从根对话框传递给 FindRecipeGetShoppingCart 对话框,并在 GetShoppingCart 对话框中执行以下操作:

IDialog recipe_dialog = dialogs.Find(FindRecipeDialog.Id);
dc.Dialogs.Add(FindRecipeDialog.Id, recipe_dialog);
await dc.Replace(FindRecipeDialog.Id, dialogArgs);

有了这个,我能够成功进入 FindRecipe 对话框,而不会创建无限循环。 在 FindRecipe 对话框中,它执行第一个 watterfall 步骤:

async(dc, args, next) =>
{
    UserStateObject newUserStateObject;
    var userState = UserState<UserState>.Get(dc.Context);
    UserStateObject userStateObject = JsonConvert.DeserializeObject<UserStateObject>(userState.UserStateObject);
    if (args == null) {
        await FindRecipe(dc);
    } else {
        newUserStateObject = args["userState"] as UserStateObject;
        if(newUserStateObject.UserInputs.UserRecipeChoices == RecipeUserChoicesEnum.AddAnotherProductChoice) 
            await AddOtherProductChoice(dc, userStateObject);
    }
}

但是,在仅完成一种方法之后,它会返回到 GetShoppingCart 对话框,即使 FindRecipe 对话框中仍然存在瀑布步骤。在接下来的回合中,它会在尝试执行“context.Continue()”时抛出此异常;

{System.Exception: DialogSet.continue(): Can't continue dialog. A dialog with an id of 'FindRecipe' wasn't found.   at Microsoft.Bot.Builder.Dialogs.DialogContext.Continue()   at Microsoft.Bot.Builder.Dialogs.DialogContainer.DialogContinue(DialogContext dc)   at Microsoft.Bot.Builder.Dialogs.DialogContext.Continue()   at RecipeBot.RecipesBot.OnTurn(ITurnContext context) ... }

我是否需要在某个时候再次将 FindRecipe 对话框添加到 dc.Dialogs?

我在 dc.continue() 之前尝试过(抛出异常的地方),但在这种情况下它会抛出:

{System.Exception: DialogSet.add(): A dialog with an id of 'FindRecipe' already added.   at Microsoft.Bot.Builder.Dialogs.DialogSet.Add(String dialogId, IDialog dialog)   at RecipeBot.RecipesBot.OnTurn(ITurnContext context) ... }

【问题讨论】:

  • after finishing just one method, it goes back to the GetShoppingCart dialog, even though there are still waterfall steps left in the FindRecipe dialog. 如果您可以提供可重现的示例或完整的实现,我们将测试并解决您的代码问题。

标签: botframework


【解决方案1】:

我能够解决这个问题。

每次收到消息时,我都会创建一个新对话,这是导致问题的原因:

 dialogs = new DialogSet();
 dialogs.Add(GetShoppingCartDialog.Id, new GetShoppingCartDialog());
 dialogs.Add(FindRecipeDialog.Id, new FindRecipeDialog());

为了解决这个问题,我使用了一个单例:为每个对话框创建一个实例并将其保存为对话框的变量。

 dialogs = new DialogSet();
 dialogs.Add(GetShoppingCartDialog.Id, GetShoppingCartDialog.Instance);
 dialogs.Add(FindRecipeDialog.Id, FindRecipeDialog.Instance);

【讨论】:

  • 我没有看到 Dialogset.add 方法有两个参数 - 现在只有对话框是参数
猜你喜欢
  • 1970-01-01
  • 2019-07-27
  • 1970-01-01
  • 2021-01-27
  • 2017-07-27
  • 1970-01-01
  • 1970-01-01
  • 2019-10-16
  • 1970-01-01
相关资源
最近更新 更多