瀑布对话框提示在机器人框架中不起作用



我仍在尝试掌握bot框架v4和对话框的概念。我正在尝试创建一个与Qnamaker和Luis集成的简单机器人。这两个集成都可以单独工作,但我无法将它们集成在一起。我也是第一次使用ASP.NET核心。所以我的问题可能也是如此。

所以我创建了一个基于此样本的机器人。

我有一个继承对话框类的基本对话框。基类公开了"子对话"类继承的抽象功能。儿童课被称为rootdialog。

functionDialogBase:

    public FunctionDialogBase(string dialogId, IConfiguration configuration, ILogger logger) : base(dialogId)
    {
        Configuration = configuration;
        Logger = logger;
    }
    public override async Task<DialogTurnResult> BeginDialogAsync(DialogContext dialogContext, object options = null, CancellationToken cancellationToken = default(CancellationToken))
    {   
        return await RunStateMachineAsync(dialogContext, cancellationToken).ConfigureAwait(false);
    }
    public override async Task<DialogTurnResult> ContinueDialogAsync(DialogContext dialogContext, CancellationToken cancellationToken = default(CancellationToken))
    {
        return await RunStateMachineAsync(dialogContext, cancellationToken).ConfigureAwait(false);
    }
    //abstract method
    protected abstract Task<(object newState, IEnumerable<Activity> output, object result)> ProcessAsync(object oldState, 
        Activity activity,
        DialogContext dialogContext,
        SPEntityDetails spEntityDetails,
        CancellationToken cancellationToken);
    private async Task<DialogTurnResult> RunStateMachineAsync(DialogContext dialogContext, CancellationToken cancellationToken)
        {
            var (newState, output, result) = await ProcessAsync(oldState, dialogContext.Context.Activity, dialogContext, spEntityDetails, cancellationToken).ConfigureAwait(false);     
            //do some more logic here
        }
    }

rootdialog调用另一个称为creatipitedialog的对话框,从其抽象方法实现:

rootdialog:

    protected override async Task<(object newState, IEnumerable<Activity> output, object result)> ProcessAsync(
    object oldState, 
    Activity activity,
    DialogContext dialogContext,
    SPEntityDetails spEntityDetails, 
    CancellationToken cancellationToken)
    {
        dialogContext.Dialogs.Add(new CreateSiteDialog());
        await dialogContext.BeginDialogAsync(nameof(CreateSiteDialog),spEntityDetails, cancellationToken);
        return (null, new Activity[] { activity.CreateReply("Site created successfully.") }, null);
    }       

最终有问题的createsitedialog。该对话框遵循瀑布模型,理论上应该从一个瀑布步骤移动到下一个瀑布,直到结束。这没有发生。当我在第一步中使用提示时,它执行并从瀑布对话框中出来。下一个瀑布步骤从未执行。

createsitedialog:

public class CreateSiteDialog : CancelAndHelpDialog
{
    public CreateSiteDialog() : base(nameof(CreateSiteDialog))
    {
        AddDialog(new TextPrompt(nameof(TextPrompt)));
        AddDialog(new ConfirmPrompt(nameof(ConfirmPrompt)));
        AddDialog(new WaterfallDialog(nameof(WaterfallDialog), new WaterfallStep[]
        {
            ConfirmStepAsync,
            FinalStepAsync
        }));
        // The initial child Dialog to run.
        InitialDialogId = nameof(WaterfallDialog);
    }
    private async Task<DialogTurnResult> ConfirmStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
    {
        var spEntityDetails = (SPEntityDetails)stepContext.Options;
        var msg = @"Creating site: http://yoursiteurl/"  + spEntityDetails.SiteName + ". Confirm Yes/No.";          
        return await stepContext.PromptAsync(nameof(ConfirmPrompt), new PromptOptions { Prompt = MessageFactory.Text(msg) }, cancellationToken);        
    }
    private async Task<DialogTurnResult> FinalStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
    {
        //handle propmt result from user action
    }
}

也没有错误。因此,我假设我在对话的使用中做错了什么。请。任何帮助将不胜感激。

我使用的是Visual Studio 2017,带有核心机器人项目的BOT框架模拟器,Bot Framework V4。

对于我的一生,我无法与该样本一起使用瀑布对话(基本上没有重写整个过程(。我建议您以11. Qnamaker和13. core-bot的组合为基础(使用Luis,是ComponentDialog s的一个很好的例子(。我提出了两个原因:

  1. 您链接的样本是"实验性的">
  2. 您链接的样本使用了状态机器设计,这不是其他任何机器人样本都没有使用的,因此很难获得良好的支持。

为了让Qnamaker和Luis共同努力,流程确实将取决于您的用例。我无法从您包含的代码中分辨出您要做什么。因此,这个答案主要是为了使瀑布对话起作用。

相关内容

  • 没有找到相关文章

最新更新