我仍在尝试掌握bot框架v4和对话框的概念。我正在尝试创建一个与QnAMaker和LUIS集成的简单机器人。两种集成都是单独工作的,但我无法将两者都集成。我也是第一次使用ASP.NET Core。所以我的问题也可能与此有关。
因此,我基于this sample创建了一个漫游器。
我有一个继承Dialog类的基本对话框。基类公开了子对话框类继承的抽象函数。子类称为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从其抽象方法实现中调用另一个名为CreateSiteDialog的对话框,如下所示:
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框架V4与Core Bot项目一起使用。
答案 0 :(得分:0)
在我生命中,我无法让Waterfall Dialogs以该示例作为基础(基本上没有重写整个过程)。我建议您基于11.qnamaker和13.core-bot(使用LUIS并是ComponentDialog
s的一个很好的例子)的组合来建立您的漫游器。我之所以提出此建议,有两个原因:
为使QnAMaker和LUIS一起工作,流程实际上将基于您的用例。我无法从您包含的代码中看出您要做什么。因此,此答案主要是为了使瀑布对话框正常工作。