MS Bot框架卡在无限循环中发送消息



使用MS bot框架的我的机器人被卡住在facebookemulator频道上的无限循环中发送消息。

我的机器人具有" root" IDialog,有点像菜单,它根据用户的选择,调用了其他一些IDialog s。以这种方式调用儿童对话:

        ...
        else if (response.Text == MainOptions[2])
        {
            await context.Forward(new InfoCounterDialog(), ChildDialogComplete, 
                                  response, CancellationToken.None);
        }
        ...
  • response是用户发送的IMessageActivity;
  • ChildDialogComplete是一种再次构建主菜单并以这些行结束的方法:

await context.PostAsync(restartPrompt);
context.Wait(MainScreenSelectionReceived);

所有对话框都可以正常工作,除了一个非常简短的对话框(导致无限循环) - 机器人不断发送此消息,直到我停止Web应用程序为止。

namespace XXXX
{
[Serializable]
public class InfoCounterDialog : IDialog
{
    public async Task StartAsync(IDialogContext context)
    {
        var hourNow = DateTime.Now.Hour;
        var openNow = "";
        if (hourNow >= 7)
        {
            openNow = "It is open now and will close at midnight.";
        }
        else
        {
            openNow = "It is closed now and will open at 7:00";
        }
        var card = HeroCardUtils.CardWithImageAndMiscButtons(
            "Our information counter can help!",
            "It's located in Shop 081, Level 3 in Building 2. " + openNow,
            "http://www.[image URL here].jpg",
            new[] { "More Details" },
            new[] { ActionTypes.OpenUrl },
            new[] { "[webpage URL here]" }
            );
        await BotUtils.SendCardToChat(context, card);
        context.Done(this);
    }
}

}

如果您想知道SendCardToChat是什么:

    public async static Task SendCardToChat(IDialogContext context, HeroCard card)
    {
        var activity = context.MakeMessage();
        activity.Attachments = HeroCardUtils.CardToAttachments(card);
        await context.PostAsync(activity);
    }

回顾:

  • 我正在使用context.Forward()
  • 从另一个对话框启动对话框
  • 对话框应该向用户显示一条消息,并立即终止,而无需用户
  • 的额外输入
  • 相反,它不断发送"我们的信息计数器可以提供帮助!" 消息无限。

我最好的猜测是,孩子对话框以某种方式将用户的初始消息返回到对话中,该消息一次又一次地触发了相同的对话框。但这不应该发生,孩子IDialog不应将任何内容发送给对话,除了我创建的HeroCard

,或者我看的方向错误,而bot框架只是不支持IDialog S,并且在没有context.Wait()的情况下立即终止

我发现上下文上没有太多文档。done(r value),但在控制对话框的流程中确实很重要。

我猜那个上下文。done(this)再次调用您的对话?你尝试过

吗?
context.Done(true);

我发现没有context.done()方法(没有参数)告诉对话框您完成的沮丧。

此外,我发现在此Microsoft示例中,他们使用

// within a HotelsDialog.cs
context.Done<object>(null);

这是可能的,因为他们从root对话框调用对话框

// within RootDialog.cs
context.Call(new HotelsDialog(), this.ResumeAfterOptionDialog);

最新更新