机器人框架陷入对话循环中

4

我正在使用Bot Framework进行我的一个项目。在处理PromptDialog.Confirm函数的回复时,它似乎陷入了循环。

namespace Genome
{
public class InitiateDialog : IDialog<object>
{
    public async Task StartAsync(IDialogContext context)
    {
        context.Wait(ConversationStarted);
    }

    public async Task ConversationStarted(IDialogContext context, IAwaitable<IMessageActivity> message)
    {
        await context.PostAsync("Hi!");
        PromptDialog.Confirm(
            context: context,
            resume: ResumeAndPromptPlatformAsync,
            prompt: "Would you like to upload the document?",
            retry: "I didn't understand. Please try again."
            );
    }

    public async Task ResumeAndPromptPlatformAsync(IDialogContext context, IAwaitable<bool> result)
    {
        await context.PostAsync("Input Received");
    }
}
}

执行此代码时,永远不会到达ResumeAndPromptPlatformAsync函数。每次在PromptDialog.Confirm()中选择Yes/No时,Bot仿真器都会回到ConversationStarted()并再次询问相同的问题。

你使用的BotBuilder NuGet包的版本是多少? - Ezequiel Jadib
1个回答

1
我认为你现在的代码是正确的,但是之前的代码可能有错误导致了循环。由于机器人框架会自动保存状态,所以你仍然需要使用旧代码。
如果你正在使用Facebook渠道,请键入“/deleteprofile”来重置状态并开始使用新代码。如果你在仿真器上,请点击删除数据或者与一个新用户开始新的对话。
另外,你的ResumeAndPromptPlatformAsync方法必须以context.Waitcontext.Done结束,否则你会引发异常,这也可能是问题的原因。
更新:我运行了你的代码,在我添加了context.Done(this);之后,它按预期工作。我正在使用仿真器。
public async Task ResumeAndPromptPlatformAsync(IDialogContext context, IAwaitable<bool> result)
{
    await context.PostAsync("Input Received");
    context.Done(this);
}

我可以重现这个问题,它在这个问题中被发布了(我在我的ResumeAndPromptPlatformAsync中使用了context.Done)。它从未到达过这个方法。 看起来像是botframework中的一些bug。我从昨天开始就面临着这种情况。 - rajkiran
我已经运行了代码,在添加上下文后它对我有效。完成。 - user6269864
我添加了context.done并且它处理了问题,但是在我的机器人窗口中看不到promptdialog,只有纯文本。帮帮忙!!! - Chirag K
提示对话框是文本。 - user6269864

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接