我正在Bot Framework中使用主动消息,在这里我想中断对话框,直到主动消息作出响应为止,然后才继续对话框。 在收到主动消息之前,我找不到停止和恢复当前对话框的方法(让我知道是否存在!),但是,我发现应该有一种触发事件的方法,该事件基本上是第2部分对话框的内容。
我正在尝试从代码中调用Bot Framework“自定义事件”,作为机器人主动消息回调的一部分。由于我使用的是自适应对话框,因此下面是我用来调用自定义事件的代码:
private async Task BotCallback(ITurnContext turnContext, CancellationToken cancellationToken)
{
var conversationStateAccessors = conversationState.CreateProperty<DialogState>(nameof(DialogState));
var dialogSet = new DialogSet(conversationStateAccessors);
var rootFile = resourceExplorer.GetResource(rootDialogFile);
var rootDialog = resourceExplorer.LoadType<AdaptiveDialog>(rootFile);
dialogSet.Add(rootDialog);
var dialogContext = await dialogSet.CreateContextAsync(turnContext, cancellationToken);
await dialogContext.EmitEventAsync("CustomApproveIntent", rootDialog);
}
在对话框文件中,我注册了这样的自定义事件:
{
"$kind": "Microsoft.OnDialogEvent",
"$designer": {
"id": "5yPZZ2",
"name": "CustomApproveIntent"
},
"event": "CustomApproveIntent",
"actions": [
{
"$kind": "Microsoft.SendActivity",
"$designer": {
"id": "jQTi2S"
},
"activity": "${SendActivity_jQTi2S()}"
}
]
}
运行代码并调用主动消息时,我确实从输出窗口日志中注意到,自定义事件已按预期触发:
Information: 0 : 4: 'event' ==> CustomApproveIntent ==> OnDialogEvent(CustomApproveIntent)
Information: 0 : Executing Dialog: echobot-final.dialog Rule[3]: OnDialogEvent: ((turn.dialogEvent.name == 'CustomApproveIntent') && True)
自定义事件只有一个动作,即发送漫游器响应。但是,即使看起来好像触发了自定义事件,我也没有在模拟器中收到机器人响应。
当我作为自适应对话框的一部分而不是通过代码触发自定义事件时,机器人响应会在模拟器中正确显示,因此我的代码调用自定义事件一定是一个问题。下面是对话框中对自定义事件的工作调用,它证明了自定义事件本身是可以正常工作的:
{
"$kind": "Microsoft.EmitEvent",
"$designer": {
"id": "n5vhkg"
},
"eventName": "CustomApproveIntent"
}
关于为什么在我的自定义事件中触发的漫游器响应在通过代码触发时未显示的任何想法,或者我怎么可能对此进行调试?
由于OnDialogEvent(CustomApproveIntent)
作为自适应对话框的一部分运行,因此我所看到的只是EmitEventAsync没有给出任何错误。我不确定如何轻松地在某个地方放置断点以查看发生了什么?