>发送文本到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已更新,因为当我尝试检索它时,它被更新…
欢迎任何帮助:)
谢谢
[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自己“提交”它,所以没有冲突