【问题标题】:Microsoft Bot Framework: Exception: The data is changedMicrosoft Bot Framework:异常:数据已更改
【发布时间】:2017-03-17 14:24:03
【问题描述】:

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

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

    private static async Task storeBotData(IDialogContext context, BotData userData) { Activity activity = (Activity)context.Activity; StateClient sc = activity.GetStateClient(); await 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...

我试图捕捉异常,但没有捕捉到任何东西。但我知道 userData 已更新,因为当我尝试检索它时,它已更新...

欢迎任何帮助:)

谢谢

【问题讨论】:

  • 您使用的是哪个版本的框架?

标签: botframework azure-language-understanding


【解决方案1】:

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 : These botData objects will fail to be stored if another instance of your bot has changed the object already. 所以在你的情况下,异常发生在对话框终止时,当框架自己调用 setUserData 并发现 BotData 已经更改(通过你明确调用 @ 987654325@)。我想这就是你无法捕捉到异常的原因。

解决方案: 我使用了以下代码,它解决了这个问题:

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

之所以起作用,是因为我们修改了 UserData 的对象,但允许 botFramework 自己“提交”它,所以没有冲突

【讨论】:

  • 感谢@Artem,它运行良好。您的权利,最好将“提交”部分留给框架本身。 +1
【解决方案2】:

我同意@Artem(这也解决了我的问题,谢谢!)。我只想添加以下准则。

使用

var data = context.UserData;
data.SetValue("field_name", false);

只要有可用的 IDialogContext 对象,您就可以让 Bot Framework 提交更改。

改为使用

StateClient sc = activity.GetStateClient();
await sc.BotState.SetUserDataAsync(activity.ChannelId, activity.From.Id, userData);

当您没有 IDialogContext 对象时,例如在 MessageController 类中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2018-04-22
    相关资源
    最近更新 更多