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

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

>发送文本到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自己“提交”它,所以没有冲突

相关文章

Windows2012R2备用域控搭建 前置操作 域控主域控的主dns:自...
主域控角色迁移和夺取(转载) 转载自:http://yupeizhi.blo...
Windows2012R2 NTP时间同步 Windows2012R2里没有了internet时...
Windows注册表操作基础代码 Windows下对注册表进行操作使用的...
黑客常用WinAPI函数整理之前的博客写了很多关于Windows编程的...
一个简单的Windows Socket可复用框架说起网络编程,无非是建...