对话结束后在 ProActive 消息中使用 ContinueDialogAsync

Use ContinueDialogAsync in ProActive message after ending dialog turn

我正在尝试 'pause' 机器人对话并通过主动消息恢复它。

我一直在尝试这样做的方法是 结束对话 到 'pause' 对话。接下来我在我的 ProActive 消息中使用 ContinueDialogAsync 到 'resume' 对话。以下是我作为主动消息的一部分执行此操作的方式:

DialogManager dialogManager = new DialogManager(this.resourceExplorer.LoadType<AdaptiveDialog>(this.resourceExplorer.GetResource("echobot-final.dialog")));
dialogManager.UseResourceExplorer(this.resourceExplorer);
dialogManager.UseLanguageGeneration();

var conversationStateAccessors = conversationState.CreateProperty<DialogState>(nameof(DialogState));
var dialogSet = new DialogSet(conversationStateAccessors);
dialogSet.Add(dialogManager.RootDialog);
var dialogContext = await dialogSet.CreateContextAsync(turnContext, cancellationToken);

但是,当运行在 ContinueDialogAsync 对话结束之前 之后,我 运行 遇到了这个错误:

System.NullReferenceException
  HResult=0x80004003
  Message=Object reference not set to an instance of an object.
  Source=Microsoft.Bot.Builder.Dialogs.Adaptive
  StackTrace:
   at Microsoft.Bot.Builder.Dialogs.Adaptive.Generators.ResourceMultiLanguageGenerator.TryGetGenerator(DialogContext dialogContext, String locale, LanguageGenerator& languageGenerator)

虽然从对话框中删除 EndTurn 时我没有收到此 NullReferenceException,所以我相信我的 dialogContext 对象应该是正确的?

我是否误解了结束对话回合的概念?

暂停对话并稍后恢复对话的正确方法是什么?

在 Bot Framework 中,turn 是机器人在 HTTP 请求中收到 activity 与机器人响应该请求之间的时间。请注意,响应 HTTP 请求不同于响应 activity。机器人可以通过在自己的 HTTP 请求中向 ABS 发送新活动来进行回复,并且可以轮流执行多次。 HTTP 响应不是另一个 activity,它只是一个表示回合结束的状态代码(如 200 OK)。

实际上并没有“对话回合”的概念。瀑布对话和自适应对话中有“步骤”,但它们与回合无关,因为一个步骤可以跨越多个回合,一个回合可以跨越多个步骤。自适应对话框中有一个“结束对话回合”动作,我认为这就是你在说的,但它只是结束了回合。 “对话”一词可能 superfluous/misleading 在那里。

也没有真正“暂停”对话的概念。对话被理解为机器人与一个或多个用户之间交换的一系列轮流和活动。您的机器人始终需要知道如何处理到达其端点的每个请求,因此由您来定义暂停对话的含义。

我猜您希望机器人在对话暂停时做出不同的响应或根本不响应。您将需要某种机器人状态,以便机器人知道它已针对给定用户或对话暂停,并且对话使用机器人状态,因此对话可以。无论您做什么来向机器人表明对话已暂停,您都可以撤消它以取消暂停。仅仅结束回合是行不通的,因为这不会向状态添加任何内容,下一个回合将在用户发送消息后立即开始。