运行dc.BeginDialogAsync(...)不会在堆栈上放置对话框

时间:2019-07-17 16:20:03

标签: c# .net botframework state-management

我正在尝试从MainDialog运行一个瀑布对话框。看来,当我运行await dc.BeginDialogAsync(nameof(OnboardingDialog));时,我就进入了OnboardingDialog的第一步,这很好。但是,当我响应该对话框中的第一个提示时,我将返回到我的RouteDialog中。看来原因是因为在我的DialogBot.cs的{​​{1}}方法中,OnTurnAsync等于dc.ActiveDialog,因此我的null被调用了再次。这是我的MainDialog

OnTurnAsync

public override async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken)) { var dc = await _dialogs.CreateContextAsync(turnContext); if (dc.ActiveDialog != null) { var result = await dc.ContinueDialogAsync(); } else { await dc.BeginDialogAsync(typeof(T).Name); } // Save any state changes that might have occured during the turn. await ConversationState.SaveChangesAsync(turnContext, false, cancellationToken); await UserState.SaveChangesAsync(turnContext, false, cancellationToken); } 调用MainDialog时,它会触发await dc.BeginDialogAsync(typeof(T).Name)方法,该方法可以简化为:

RouteAsync

然后,当我对protected override async Task RouteAsync(DialogContext dc, CancellationToken cancellationToken = default(CancellationToken)) { await dc.BeginDialogAsync(nameof(OnboardingDialog)); } 中的第一步做出响应时,由于OnboardingDialog为空,我只是再次点击了await dc.BeginDialogAsync(typeof(T).Name);,而不是继续我的对话dc.ActiveDialog

我已经尝试了一些通过访问器创建的var result = await dc.ContinueDialogAsync()上具有保存/设置状态的操作,但是似乎没有什么使我的机器人意识到它应该在瀑布对话框中。我可以共享项目,但不能在公共场所共享。让我知道是否有人提示如何保存DialogState的状态。谢谢。

1 个答案:

答案 0 :(得分:1)

OP在评论中提到它仅在Cosmos中发生。因此,here's another user who just experienced this

然后,the answer

  

现在,如果您从CosmosDbStorageOptions中删除了$(".msg-payload").text(atob($(".msg-payload").text())) 参数,它应该可以工作。由于您的容器当前已分区,您可能需要删除您的容器或使用其他名称。最简单的方法就是删除您的容器,然后让机器人为您创建一个容器。

     

提供了partitionKey时,所有Bot Builder SDK中目前都存在一个从分区数据库读取数据的错误。 Tracking the issue here