Bot Framework Composer中如何终止被Allow Interruption打断的原有对话
Bot Framework Composer 中断场景下终止上级对话的正规实现方案
Composer的对话栈遵循后进先出规则,HelpDialog通过中断触发时,会被压在Dialog A的上层,默认HelpDialog结束弹出栈后自然回到下层的Dialog A,要避免恢复只需主动将Dialog A从对话栈中移除即可,官方原生支持两种正规实现方式:
1. 无代码内置动作实现(优先推荐)
直接使用Composer原生提供的Cancel all dialogs动作即可实现需求,配置步骤如下:
- 定位到HelpDialog中需要终止Dialog A并跳转的逻辑节点
- 添加取消所有对话(
Cancel all dialogs)内置动作 - 动作参数按需配置:
- 取消范围选择父级及以上对话,即可精准移除被中断的Dialog A及更上层的其他父对话
- 若需要保留HelpDialog的上下文数据,可勾选「保留当前对话」选项
- 紧接该动作之后添加开始新对话动作,选择你需要触发的目标对话即可
该动作执行后Dialog A会被直接销毁,HelpDialog执行完后续逻辑后不会再触发Dialog A的恢复流程。
2. 自定义代码实现(适配复杂场景)
如果需要精准控制仅移除特定对话、不影响其他栈内容,可以通过操作对话上下文的栈结构实现:
在对应节点添加代码段动作,以C#运行时为例,代码示例如下:
// 循环移除Dialog A及上层非当前HelpDialog的所有对话 while (dc.ActiveDialog != null && dc.ActiveDialog.Id != "HelpDialog") { await dc.CancelDialogAsync(cancellationToken); } // 移除完成后直接启动目标对话 await dc.BeginDialogAsync("你的目标对话ID", cancellationToken: cancellationToken);
JS运行时只需按对应语法调整API调用即可实现相同效果。
注意事项
不要仅使用End this dialog动作结束HelpDialog,该动作只会将HelpDialog自身弹出栈,下层的Dialog A依然存在,会自动触发恢复逻辑。
内容的提问来源于stack exchange,提问作者user16540151
相关产品推荐
相关产品推荐

