MS Bot Framework在无限循环中阻止发送消息

时间:2016-12-01 04:18:43

标签: c# bots botframework botbuilder

我使用MS Bot Framework的机器人无法在facebookemulator频道上以无限循环向用户发送消息。

我的机器人有一个" root" IDialog,有点像菜单,根据用户的选择调用其他几个IDialog。以这种方式调用子对话框:

        ...
        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 Framework不支持IDialog做某事并立即终止而没有context.Wait()

1 个答案:

答案 0 :(得分:1)

我发现没有太多关于context.Done(R值)的文档,但它对控制对话框的流程非常重要。

我猜这个context.Done(this)再次调用你的Dialog?你试过吗

context.Done(true);

我发现没有一个context.Done()方法(没有参数)告诉对话框你已经完成了,这令人沮丧。

除此之外,我发现在this Microsoft Example中他们使用

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

这是可能的,因为他们从root dialog

调用对话框
// within RootDialog.cs
context.Call(new HotelsDialog(), this.ResumeAfterOptionDialog);