botframework - 微软机器人框架: Exception: The data is changed

标签 botframework azure-language-understanding

我有一个具有以下对话场景的机器人:

  1. 向 LUIS 发送文本
  2. LUIS 意图调用 context.Call(...) 来启动对话框
  3. 此对话框终止,在 userData 中保存一些信息:

    私有(private)静态异步任务 storeBotData(IDialogContext context, BotData userData) { Activity 事件 = (Activity)context.Activity; StateClient sc = Activity.GetStateClient(); 等待 sc.BotState.SetUserDataAsync(activity.ChannelId, Activity.From.Id, userData); }

    在调用另一个对话框后,再次使用 context.Call(...)

  4. 然后最后一个对话框运行并终止。

我的问题是,在第一个对话框结束时更新用户数据(步骤 3)时,Bot Framework Channel Emulator 中出现以下异常:

         `Exception: The data is changed [File of type 'text/plain']`...

这里发生了什么?我认为当对话框终止时,它会自行调用 setUserData ,但我不明白为什么我无法在代码中的任何位置更新 userData...

我 try catch 异常,但没有捕获任何内容。但我知道 userData 已更新,因为当我尝试检索它时,它已更新...

欢迎任何帮助:)

谢谢

最佳答案

Botframework 在每次事件之后恢复/保存对话状态,因此在幕后典型流程如下所示:

[23:15:40] <- GET 200 getUserData 
[23:15:47] <- GET 200 getConversationData 
[23:15:47] <- GET 200 getPrivateConversationData 
...
[23:16:42] <- POST 200 setConversationData 
[23:16:42] <- POST 200 setUserData 
[23:16:42] <- POST 200 setPrivateConversationData 

正如提到的here :如果您的机器人的另一个实例已经更改了该对象,这些 botData 对象将无法存储。因此,在您的情况下,当框架自行调用 setUserData 并计算出对话框终止时,异常会发生BotData 已更改(通过显式调用 BotState.SetUserDataAsync)。我想这就是你无法捕获异常的原因。

解决方案: 我使用了以下代码并解决了该问题:

private static void storeBotData(IDialogContext context, BotData userData)
{
        var data = context.UserData;
        data.SetValue("field_name", false);            
}

它起作用的原因是我们修改了UserData的对象,但允许botFramework自己“提交”它,所以不存在冲突

关于botframework - 微软机器人框架: Exception: The data is changed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42860020/

相关文章:

azure-cognitive-services - LUIS 中似乎不存在 API.ai 上下文

c# - 解析 LuisResult 以获取值字段

botframework - '哎呀。出了点问题,我们需要重新开始。使用带有 LUIS 模板的 Microsoft Bot 服务

node.js - Bot Emulator 连接到另一台计算机上的 Node.js 服务

oauth-2.0 - 使用 GetOauthSignInLinkAsync 时发送 acr_values

c# - 使用中间件的聊天记录

azure - 将 Microsoft Bot Framework Bot 限制为特定 AD 租户

node.js - waterfall 对话中的 Microsoft Bot Framework LUIS

c# - 如何发布 LUIS 应用

c# - 使用 Bot Framework 向模拟器上的同一对话发送消息