在c#中
当收到输入的消息时,机器人控制器会触发 _adapter.ProcessAsync(Request, Response, _bot) 中间件会在回合完成后保存当前的机器人状态,包括对话堆栈。
当接收到主动消息时,调用 _adapter.ContinueConversationAsync(_appId, conversationReference, BotCallback) 中间件的不同控制器将再次保存机器人状态,包括回合完成时的对话堆栈。
似乎存在竞争条件。机器人服务器代码可以为同一个对话/用户同时运行,因此保存的机器人状态 + 对话堆栈最终成为最后运行的胜利。
_adapter.ProcessAsync(请求,响应,_bot); --- 开始捕获机器人状态
主动消息恢复
ContinueConversationAsync ... --- 开始捕获机器人状态
--- 中断当前对话
--- 运行自适应对话框,提出问题
--- 结束保存其机器人状态版本
_adapter.ProcessAsync(请求,响应,_bot); --- 结束保存其机器人状态版本 --- 覆盖主动保存的机器人状态
这可以表现为 botframework 无法找到对话框 id 异常,因为在调用对话框继续时预期的对话框不在对话框堆栈中。
有没有一种方法可以确保为每个 conersationid / 用户顺序处理发送到 bot 服务器代码的消息?