已调用ResumeAfter方法而不在下一个对话框中调用context.done

时间:2018-03-08 14:50:53

标签: botframework luis qnamaker

我已经实现了首次启动QnA对话框的结构。如果QnA Dialog无法解决问题,那么它会启动一个Luis Dialog,它定义了一些主要功能。基于这些主要功能,我启动了可以解决问题的特定对话框。

我的问题是,当我尝试从QnAMaker启动LuisDialog时,它启动另一个LuisDialog进行对话,该对话框不会停止使用wait方法并在执行后立即自动调用ResumeAfter方法。

QnADialog:

protected override async Task RespondFromQnAMakerResultAsync(IDialogContext context, IMessageActivity message, QnAMakerResults results)
{
    if (results == null || results.Answers.Count==0 || !IsConfidentAnswer(results) || results.Answers.FirstOrDefault().Score<0.75) {
        await context.Forward(new MainLuisDialog(), MessageReceived, context.Activity.AsMessageActivity(), CancellationToken.None);

    }
}

First Luis Dialog:

[LuisIntent(ErrorFileLink)]
public async Task ErrorFileLinkIntentHandler(IDialogContext context, LuisResult result) {
    await context.Forward(new ErrorFileLinkDialog(), CallBackHandler, context.Activity.AsMessageActivity(), CancellationToken.None);
}

private async Task CallBackHandler(IDialogContext context, IAwaitable<object> result)
{
    try {
        var returnedResult = await result;
        if (returnedResult as string == "done")
            context.Done(false);
    }
    catch (Exception e) {
    }
}

第二届路易斯对话:

[LuisIntent(MainAppIntent)]
public async Task MainAppIntentHandler(IDialogContext context, LuisResult result)
{
    if(context.GetPrivateConversationData<SyncIssueStates>(CurrentDialogState) == SyncIssueStates.ExpectingSyncCompleteMessage)
    {
        await context.PostAsync(Utility.GetResourceString("SYNC_ISSUE_PLEASE_WAIT_SYNC_COMPELTE"));
        context.Wait(MessageReceived);
        return;
    }
    await context.PostAsync(Utility.GetResourceString("SYNC_ISSUE_GET_ERROR_MESSAGE"));
    context.SetPrivateConversationData(CurrentDialogState, SyncIssueStates.ExpectingErrorMessage);
    context.Wait(MessageReceived);
}

在执行转发后立即调用First Luis Dialog中的CallBackHandler方法。

1 个答案:

答案 0 :(得分:0)

我认为这种行为是由于 QnAMakerDialog DefaultWaitNextMessageAsync 方法中调用context.Done(true);这一事实。参考:https://github.com/Microsoft/BotBuilder-CognitiveServices/blob/master/CSharp/Library/QnAMaker/QnAMaker/QnAMakerDialog.cs#L203

尝试改为覆盖 DefaultWaitNextMessageAsync 方法:

protected override async Task DefaultWaitNextMessageAsync(IDialogContext context, IMessageActivity message, QnAMakerResults results)
{
    if (results == null || results.Answers.Count == 0 || !IsConfidentAnswer(results) || results.Answers.FirstOrDefault().Score < 0.75)
    {
        await context.Forward(new FirstDialog(), AfterForward, context.Activity.AsMessageActivity(), CancellationToken.None);
        context.Wait(base.MessageReceivedAsync);
    }
    else
    {
        await base.DefaultWaitNextMessageAsync(context, message, results);
    }
}