我正在构建一个机器人,我想在Bot State Service中保存并检索一些状态(使用.NET Bot Builder SDK)。由于保存在IDialogContext的PrivateConversationData或UserData属性中没有工作(它没有保存任何东西),我所做的是在对话框中编写一段类似于以下内容的代码:
List<Value> valuesToStore = GetSomeValuesToStore();
StateClient stateClient = ((Activity)context.Activity).GetStateClient();
BotData userData = await stateClient.BotState.GetUserDataAsync(context.Activity.ChannelId, context.Activity.Conversation.Id);
if (userData != null && userData.GetProperty<List<Value>>(VALUES_NAME) != null)
{
DoSomethingWithUserData(userData);
}
else
{
//save values in state
userData.SetProperty(VALUES_NAME, valuesToStore);
await stateClient.BotState.SetUserDataAsync(context.Activity.ChannelId, context.Activity.Conversation.Id, userData);
}
在该代码执行一次之后,每当有新消息到达我的机器人时,我就会开始收到以下异常:
"Settings must be of the form \"name=value"\."
它似乎与Azure存储连接有关(Bot Framework用于存储状态我猜)。不知怎的,我把机器人置于一个不一致的状态,我找到的唯一解决办法就是在Bot Framework Developer Portal中创建一个新机器人,并自己保存状态。
前段时间,类似的我也遇到了类似的错误:
"Null properties cannot be encrypted. Please assign a default value to the property if you wish to encrypt it.";
这显然是因为我试图存储的对象包含具有空值的属性。但同样的事情,我无法使机器人恢复正常状态;我不得不创建一个新消息,因为每当机器人试图检索状态时,每个新消息都会导致异常。
对此有何想法?
谢谢!
答案 0 :(得分:1)
当状态中断时,您可以向机器人发送“/ deleteProfile”消息,机器人将清除该用户的状态。
建议不要将默认状态客户端用于生产机器人。请查看此博文https://blog.botframework.com/2017/07/18/saving-state-azure-extensions/
activity.GetStateClient()是默认的状态客户端。您应该使用IDialogContext
方法与州进行交互。你提到“它没有保存任何东西”。为什么不呢?
空属性可以保存到状态。那应该不是问题。您在状态中看到的有关null属性的错误是一个已修复的错误。