加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

botframework – Microsoft Bot Framework:例外:数据已更改

发布时间:2020-12-13 23:44:59 所属栏目:Windows 来源:网络整理
导读:我有一个机器人与以下对话场景: 发送文本到LUIS LUIS intent调用context.Call(…)来启动Dialog 此对话框终止,在userData中保存一些信息: private static async Task storeBotData(IDialogContext context,BotData userData) { 活动活动=(活动)context.Acti
我有一个机器人与以下对话场景:

>发送文本到LUIS
> LUIS intent调用context.Call(…)来启动Dialog
>此对话框终止,在userData中保存一些信息:

private static async Task storeBotData(IDialogContext context,BotData userData)
{
活动活动=(活动)context.Activity;
StateClient sc = activity.GetStateClient();
等待sc.BotState.SetUserDataAsync(activity.ChannelId,activity.From.Id,userData);
}

在它调用另一个对话框后,再次使用context.Call(…).
>然后最后一个对话框运行并终止.

我的问题是,在第一个对话框结束时更新用户数据(步骤3)时,我在Bot框架通道模拟器中有以下异常:

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

这里发生了什么?我认为当一个对话框终止时,它会自己调用setUserData,但我不明白为什么我不能在代码中的任何地方更新userData …

我试图捕获异常,但没有任何东西被捕获..但我知道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自己“提交”它,所以没有冲突

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读