使用 context.call/done 链接多个对话框



我有一个LuisDialog,如果找到意图,它会调用特定的对话框。在那里,在提取的实体的基础上,我正在调用另一个对话框,它似乎抛出了一些未处理的异常。这是我的根LuiDialog调用BuyDialog的意图(我正在保存LuisResult以供以后使用)-

[LuisIntent("Buy")]
public async Task Buy(IDialogContext context,  LuisResult result)
{
   var cts = new CancellationTokenSource();
   await context.PostAsync("you want to buy");
   context.PrivateConversationData.SetValue<LuisResult>("luis", result);
   context.Call(new BuyDialog(), ResumeAfterBuyDialog);
}
 private  async Task ResumeAfterBuyDialog(IDialogContext context, IAwaitable<bool> result)
    {
        var success = await result;
        if (success)
        {
            await context.PostAsync("How else can I help you?");
            context.Wait(MessageReceived);
          }
    }

这是我的 BuyDialog 调用另一个对话框(BookDialog),如果实体包含"book"字符串-

else if(is_book)
                {
                    await context.PostAsync("You selected book category");
                    context.Call(new BookDialog(),BookFormComplete);
                    context.Done(true);
                }
 private async Task BookFormComplete(IDialogContext context, IAwaitable<bool> result)  
    {
        var BookResult = await result;
        //do something if result is true
    }

这是我的书对话——

[Serializable]
public class BookDialog : IDialog<object>
{
    public  async Task StartAsync(IDialogContext context)
    {
        context.Wait(MessageReceivedAsync);
    }
    public async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> argument)
    {
        var message = await argument;
        if (message.Text == "mtl100")
        {
            await context.PostAsync("Correct");
            context.Done(true);
        }
        else
        {
            await context.PostAsync("Please enter valid course code");
            context.Wait(MessageReceivedAsync);
        }

我知道问题出在第二个上下文.call(对bookDialog的调用)中,因为如果我删除它,代码可以正常工作。现在,当它到达那里时,我得到"对不起,我的机器人代码有问题"。知道出了什么问题吗?

您在

第二个对话框中执行的context.Done(true)必须在BookDialog ResumeAfter<T>方法中 ( BookFormComplete

"是书"路径应如下所示:

else if(is_book)
{
    await context.PostAsync("You selected book category");
    context.Call(new BookDialog(),BookFormComplete);
}

最新更新