我使用MS Bot Framework的机器人无法在facebook
和emulator
频道上以无限循环向用户发送消息。
我的机器人有一个" 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()
?
答案 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);