尝试在 Bot Framework 状态服务中保存对象后状态不一致

Inconsistent state after trying to save object in Bot Framework 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.";

这显然是因为我试图存储的对象包含具有空值的属性。但同样的,我无法让机器人 return 进入正常状态;我必须创建一个新消息,因为每当机器人尝试检索状态时,每条新消息都会导致异常。

对此有什么想法吗?

谢谢!

当状态被破坏时,您可以向机器人发送 " /deleteProfile" 消息,机器人将为该用户清除状态。

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

activity.GetStateClient() 是默认状态客户端。您应该使用 IDialogContext 方法与状态交互。你提到 "it wasn't saving anything"。为什么不呢?

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