Botframework Microsoft Bot Framework:异常:数据已更改

Botframework Microsoft Bot Framework:异常:数据已更改,botframework,azure-language-understanding,Botframework,Azure Language Understanding,我有一个具有以下对话场景的机器人: 给路易斯发短信 LUIS intent调用上下文。调用(…)启动对话框 此对话框终止,请在userData中保存一些信息: 私有静态异步任务storeBotData(IDialogContext上下文,BotData userData) { 活动活动=(活动)context.Activity; StateClient sc=activity.GetStateClient(); 等待sc.BotState.SetUserDataAsync(activity.Ch

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

  • 给路易斯发短信
  • LUIS intent调用
    上下文。调用(…)
    启动对话框
  • 此对话框终止,请在userData中保存一些信息:

    私有静态异步任务storeBotData(IDialogContext上下文,BotData userData)
    {
    活动活动=(活动)context.Activity;
    StateClient sc=activity.GetStateClient();
    等待sc.BotState.SetUserDataAsync(activity.ChannelId、activity.From.Id、userData);
    }

    然后调用另一个对话框,再次调用
    context.call(…)

  • 然后,最后一个对话框运行并终止

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

             `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 
    
    它工作的原因是我们修改了UserData的对象,但允许botFramework自己“提交”它,因此没有冲突

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

    使用

    只要有IDialogContext对象可用,就可以让Bot框架提交更改

    改用

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

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

    您使用的是哪个版本的框架?谢谢@Artem,它工作得非常好。您的权利,最好将“提交”部分留给framewrok本身+1.
    var data = context.UserData;
    data.SetValue("field_name", false);
    
    StateClient sc = activity.GetStateClient();
    await sc.BotState.SetUserDataAsync(activity.ChannelId, activity.From.Id, userData);