尝试在Bot Framework State Service中保存对象后的状态不一致

时间:2017-09-18 00:08:14

标签: botframework azure-table-storage

我正在构建一个机器人,我想在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.";

这显然是因为我试图存储的对象包含具有空值的属性。但同样的事情,我无法使机器人恢复正常状态;我不得不创建一个新消息,因为每当机器人试图检索状态时,每个新消息都会导致异常。

对此有何想法?

谢谢!

1 个答案:

答案 0 :(得分:1)

当状态中断时,您可以向机器人发送“/ deleteProfile”消息,机器人将清除该用户的状态。

建议不要将默认状态客户端用于生产机器人。请查看此博文https://blog.botframework.com/2017/07/18/saving-state-azure-extensions/

activity.GetStateClient()是默认的状态客户端。您应该使用IDialogContext方法与州进行交互。你提到“它没有保存任何东西”。为什么不呢?

空属性可以保存到状态。那应该不是问题。您在状态中看到的有关null属性的错误是一个已修复的错误。