使用MS bot框架的我的机器人被卡住在facebook
和emulator
频道上的无限循环中发送消息。
我的机器人具有" 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);