【问题标题】:Dialog is not continuing from where it waited for user input对话框没有从它等待用户输入的地方继续
【发布时间】:2019-02-01 12:58:16
【问题描述】:

此代码使用 botframework 4

我有 rootdialog,它正在调用另一个名为choicedialog 的对话框。从choicedialog 我从BeginDialogAsync 方法返回DialogturnResult(waiting)。之后,机器人等待用户的输入。 当用户输入内容时,它应该在 ChoiceDialog 中调用 ContinueAsync 方法。但机器人正在调用 Rootdailog ContinueAsync。 这是什么原因?我该如何解决?

在Controller中的onTurnAync方法

async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken)
    {
        if (turnContext.Activity.Type == ActivityTypes.Message)
        {

                var dc = await Dialogs.CreateContextAsync(turnContext, cancellationToken);
                var dialogResult = await dc.ContinueDialogAsync();

                if (!dc.Context.Responded)
                {
                    // examine results from active dialog
                    switch (dialogResult.Status)
                    {
                        case DialogTurnStatus.Empty:
                            await dc.BeginDialogAsync(nameof(RootDialog));
                            break;

                        case DialogTurnStatus.Waiting:
                            // The active dialog is waiting for a response from the user, so do nothing.
                            break;

                        case DialogTurnStatus.Complete:
                            await dc.EndDialogAsync();
                            break;

                        default:
                            await dc.CancelAllDialogsAsync();
                            break;
                    }
                }
        }
    }

根对话框

public override async Task<DialogTurnResult> BeginDialogAsync(DialogContext context, object options = null, CancellationToken cancellationToken = default(CancellationToken))
    {
        var activity = context.Context.Activity;
        context.SendTyping(activity);
            var response = DataFromService();
            if (response == null || response.StatusCode != 1)
            {
                await context.PostAsync(Messages.StandardErrorMessage);

            }

            if (response.Data != null)
            {

                return await dialog.BeginDialogAsync(context);

            }
            else
            {
                return new DialogTurnResult(DialogTurnStatus.Waiting);
            }

    }

选择对话框

public override async Task<DialogTurnResult> BeginDialogAsync(DialogContext context, object options = null, CancellationToken cancellationToken = default(CancellationToken))
    {
        choiceStep.SaveEntityDataInContext(context: context);

        IList<IMessageActivity> messages = GenerateMessageActivity(context);

        if (messages.IsCollectionValid())
        {
            foreach (var message in messages)
            {
                await context.PostActivityToUser(message);
            }
        }
        var dialogResult = new DialogTurnResult(DialogTurnStatus.Waiting);
        return dialogResult;
    }

【问题讨论】:

    标签: c# .net dialog botframework state


    【解决方案1】:

    我没有看到您将更改保存到 DialogState 的任何地方。通常这是在OnTurnAsync 的末尾完成的。您可能正在使用AutoSaveStateMiddleware,但您没有提到这一点(坦率地说,我不会推荐它)。

    具体来说,您需要在您调用CreateProperty&lt;DialogState&gt;BotState 实例上调用SaveChangesAsync。通常是ConversationState

    如果您不这样做,每一轮都将从一个空的对话框堆栈开始,因此您所描述的行为始终在运行根对话框。

    【讨论】:

    • 感谢@DrewMarsh 的回复。我使用的是AutoSaveStateMiddleware。根据您的建议,我将状态保存在 OnTurnAsync 之后,它也无助于我实现它。
    • 您能否展示用于创建 DialogSet 和 ConversationState 设置的代码?
    • 嗨@Drew问题出在dailogSet上。我没有在DialogSet中添加子对话框。所以我在控制器中添加了DilaogSet下的所有对话框。然后它按预期工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-19
    • 1970-01-01
    • 2016-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多