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

C# 使用context.call/done链接多个对话框,c#,bots,botframework,C#,Bots,Botframework,我有一个LuisDialog,如果发现意图,它会调用一个特定的对话框。在这里,基于提取的实体,我调用了另一个对话框,它似乎抛出了一些未处理的异常。 下面是我的根LuiDialog调用BuyDialog的意图(我正在保存LuisResult供以后使用)- [LuisIntent(“购买”)] 公共异步任务购买(IDialogContext上下文,LuisResult结果) { var cts=新的CancellationTokenSource(); 等待上下文。PostAsync(“您想要购买”)

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

[LuisIntent(“购买”)]
公共异步任务购买(IDialogContext上下文,LuisResult结果)
{
var cts=新的CancellationTokenSource();
等待上下文。PostAsync(“您想要购买”);
context.PrivateConversationData.SetValue(“luis”,结果);
调用(new BuyDialog(),ResumeAfterBuyDialog);
}
私有异步任务ResumeAfterBuyDialog(IDialogContext上下文,IAwaitable结果)
{
var成功=等待结果;
如果(成功)
{
等待上下文。PostAsync(“我还能为您做些什么?”);
Wait(MessageReceived);
}
}
这里是我的BuyDialog,若实体包含“book”字符串,则调用另一个对话框(BookDialog)-

else if(is_book)
{
wait context.PostAsync(“您选择的图书类别”);
调用(new BookDialog(),BookFormComplete);
上下文。完成(true);
}
专用异步任务BookFormComplete(IDialogContext上下文,IAwaitable结果)
{
var BookResult=等待结果;
//如果结果是真的,做点什么
}
这是我的书评-

[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);
        }
[可序列化]
公共类BookDialog:IDialog
{
公共异步任务StartAsync(IDialogContext上下文)
{
Wait(MessageReceivedAsync);
}
公共异步任务消息ReceivedAsync(IDialogContext上下文,IAwaitable参数)
{
var message=等待参数;
如果(message.Text==“mtl100”)
{
等待上下文。PostAsync(“正确”);
上下文。完成(true);
}
其他的
{
等待上下文。PostAsync(“请输入有效的课程代码”);
Wait(MessageReceivedAsync);
}
我知道问题出在第二个上下文中。call(对bookDialog的调用),因为如果我删除它,代码会工作得非常好。现在,当它到达那里时,我会收到“对不起,我的bot代码有问题”。知道怎么了吗?

上下文。完成(true)您在第二个对话框中执行的操作必须在
BookDialog
ResumeAfter
方法中(
BookFormComplete

“Is Book”路径应如下所示:

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

谢谢!…顺便问一下,有没有办法通过emulator本身知道错误的来源?我读了一些关于Chain.DefaultIfException方法的文章来做这件事,但我不知道如何实现它。看看这是否有用。如果有用,请对答案进行投票
[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);
        }
else if(is_book)
{
    await context.PostAsync("You selected book category");
    context.Call(new BookDialog(),BookFormComplete);
}