我通读了这个关于保存状态数据的https://docs.microsoft.com/en-us/azure/bot-service/dotnet/bot-builder-dotnet-state。我对此有一些疑问: - 让我们通过浏览器频道公开机器人作为例子: -
存储的数据的生命周期是多少?例如,当机器人使用context.ConversationData.SetValue(..)时,当会话结束时(当用户刷新页面时)是否清除了数据?
来自Activity的From对象具有Id和Name。每次聊天会话开始时,这些是由频道生成的吗?例如,如果我正在与机器人聊天然后刷新网页,我的身份和姓名现在会改变吗?
如果您要提供代码示例,请尽可能提供C#样本
非常感谢!
答案 0 :(得分:2)
您好,我希望以下答案对您有用:
存储的数据的生命周期是多少?例如,当bot使用context.ConversationData.SetValue(..)保存数据时是数据 会话结束时清除(当用户刷新页面时)?
<强> ANS: - &GT; 强>
根据Bot Framework的指导原则,State API处于折旧状态。您必须使用自己的状态管理服务来维护Bot的状态。参考:https://docs.microsoft.com/en-us/azure/bot-service/dotnet/bot-builder-dotnet-state
因此,假设您在此情况下使用表存储或SQL数据库来存储机器人,只要您的存储帐户和数据库可用,数据就会一直存在。
来自Activity的From对象具有Id和Name。这些都是生成的 每次聊天会话开始时通过频道?例如,如果我 正在与机器人聊天然后刷新网页,现在将我的Id和 名称已更改?
<强> ANS: - &GT; 强>
这取决于您初始化聊天的方式。例如,如果您正在使用
关于对话的同样问题。如果我刷新页面并再次开始对话,我是否会获得新的会话ID?
<强> ANS: - &GT; 强>
是。每次刷新网页时,都会为您分配新的conversationId,但在DirectLine的情况下,您可以使用之前的会话ID来维护对话的历史记录。您可以将对话ID存储在本地存储或浏览器的Cookie中,并在您想要加载聊天记录时阅读。如果您不需要保存历史记录,那么我建议让webchannel处理自己的ID。
我在一些博客中读到,如果使用对话框,对话框堆栈状态会自动保存在您配置的任何存储中。这是对的吗?
<强> ANS: - &GT; 强> 是。
如果是这样,为什么?假设我刷新页面,我能够检索对话框堆栈的状态并从那里恢复对话吗?
<强> ANS: - &GT; 强>
如前所述,您需要迁移机器人以使用DirectLine API而不是网络聊天频道。因为网络聊天不支持历史,所以DirectLine。
请参阅Microsoft提供的指南和GitHub上提供的示例。 https://docs.microsoft.com/en-us/azure/bot-service/rest-api/bot-framework-rest-direct-line-3-0-concepts
答案 1 :(得分:1)
快速回答:
据我所知,没有清除。您可以查看Azure DocumentDbBotDataStore
或TableBotDataStore
here的实施情况。根据我的实现,我看到存储的数据中有一个Timestamp
列,因此你可以根据它进行清理。
生成Id
和Name
字段(针对From
,但针对Recipient
生成给定消息来源/目的地):是的,它们取决于频道。我在SO上做了详细的回答:Bot Framework User Identification
在网聊的情况下是的
是,保存对话框堆栈状态,以便您可以继续对话。 &#34;说我刷新页面,我是否能够检索对话框堆栈的状态并从那里恢复对话?&#34;:如果你有相同的细节(channelId + conversationId,userId)你应该是的。例外是webchat / directLine,您必须实现保持相同ID的事实。对于其他渠道,如Slack,Facebook Messenger等,这些项目保持不变,对话框可以在之前的消息交换中停止,