Botframework v4 在部署后保留 dialogSet

Botframework v4 preserve dialogSet after deployment

我正在使用 Microsoft bot 框架 v4。它的 DialogSet 始终保存在内存中,并在代码重建(即部署)后消失,因此在重建之前恰好在对话中的现有对话将在部署完成后出现错误(找不到所需的对话) ).

export class DialogBot extends ActivityHandler {


  private readonly conversationState: BotState;
  private readonly userState: BotState;
  private readonly dialogState: StatePropertyAccessor<DialogState>;
  private readonly nlpProcessor: NlpProcessor;
  private readonly dialogSet: DialogSet;
  private readonly cacheService: CacheService;
  private readonly mainProcessor: MainProcessors;

  constructor(conversationState: BotState, userState: BotState) {
    super();
    this.conversationState = conversationState;
    this.userState = userState;
    this.dialogState = this.conversationState.createProperty<DialogState>(
      'DialogState'
    );
    this.dialogSet = new DialogSet(this.dialogState);

您可以看到 dialogSet 总是在部署后重新启动

this.dialogSet = new DialogSet(this.dialogState);

虽然 dialogStack 持久化到 dialogState,但它的对话框数组不是

export class DialogSet {
    private readonly dialogs: { [id: string]: Dialog } = {};
    private readonly dialogState: StatePropertyAccessor<DialogState>;
    private _telemetryClient: BotTelemetryClient;
    private _version: string;

dialogs 数组只存在于内存中,它保存堆栈引用的各个 Dialog 对象。一旦你重建代码,它就消失了。

我尝试扩展 DialogSet class,并将其对话框 属性 保存到 Blob 存储,但是,Blob 仅记录 json,并且没有正确重建对话框数组(这包含所有 Dialog 对象)。

有人有通过部署保留 DialogSet 状态的解决方案吗?非常感谢。

对话框集是静态的,与状态无关。对话集表示您的机器人可能开始的一组对话,而不是您的机器人在特定对话中实际开始的对话。每次您的机器人运行时,对话集都应该相同,并且不应更改。存储在对话框 state 中的对话框 stack 是根据特定对话而变化的东西。

您应该始终在启动时将所有可能的对话添加到对话集中。这就是所有 Bot Framework 对话框应该如何工作,任何不这样做的机器人都会被破坏。你可以在每个官方 sample 中看到这种模式(注意 ComponentDialog.addDialog 内部调用 DialogSet.add)。不会调用在构造时未添加的对话框。这可确保您的机器人在重启后正常工作。