关于保存机器人状态的问题

时间:2018-04-03 08:58:33

标签: botframework

我通读了这个关于保存状态数据的https://docs.microsoft.com/en-us/azure/bot-service/dotnet/bot-builder-dotnet-state。我对此有一些疑问: - 让我们通过浏览器频道公开机器人作为例子: -

  1. 存储的数据的生命周期是多少?例如,当机器人使用context.ConversationData.SetValue(..)时,当会话结束时(当用户刷新页面时)是否清除了数据?

  2. 来自Activity的From对象具有Id和Name。每次聊天会话开始时,这些是由频道生成的吗?例如,如果我正在与机器人聊天然后刷新网页,我的身份和姓名现在会改变吗?

  3. 关于谈话的同样问题。如果我刷新页面并再次开始对话,我是否会获得新的会话ID?
  4. 我在一些博客中读到,如果使用对话框,对话框堆栈状态会自动保存在您配置的任何存储中。它是否正确?如果是这样,为什么?假设我刷新页面,我能够检索对话框堆栈的状态并从那里恢复对话吗?
  5. 如果您要提供代码示例,请尽可能提供C#样本

    非常感谢!

2 个答案:

答案 0 :(得分:2)

您好,我希望以下答案对您有用:

1

存储的数据的生命周期是多少?例如,当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数据库来存储机器人,只要您的存储帐户和数据库可用,数据就会一直存在。

2

来自Activity的From对象具有Id和Name。这些都是生成的     每次聊天会话开始时通过频道?例如,如果我     正在与机器人聊天然后刷新网页,现在将我的Id和     名称已更改?

<强> ANS: - &GT;

这取决于您初始化聊天的方式。例如,如果您正在使用

  • 网络聊天:它将是空的id。
  • Skype:它将是skype id和用户名
  • DirectLine:您可以根据需要定义自己的ID和名称。

3

关于对话的同样问题。如果我刷新页面并再次开始对话,我是否会获得新的会话ID?

<强> ANS: - &GT;

是。每次刷新网页时,都会为您分配新的conversationId,但在DirectLine的情况下,您可以使用之前的会话ID来维护对话的历史记录。您可以将对话ID存储在本地存储或浏览器的Cookie中,并在您想要加载聊天记录时阅读。如果您不需要保存历史记录,那么我建议让webchannel处理自己的ID。

4

我在一些博客中读到,如果使用对话框,对话框堆栈状态会自动保存在您配置的任何存储中。这是对的吗?

<强> ANS: - &GT; 是。

5

如果是这样,为什么?假设我刷新页面,我能够检索对话框堆栈的状态并从那里恢复对话吗?

<强> 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)

快速回答:

  1. 据我所知,没有清除。您可以查看Azure DocumentDbBotDataStoreTableBotDataStore here的实施情况。根据我的实现,我看到存储的数据中有一个Timestamp列,因此你可以根据它进行清理。

  2. 生成IdName字段(针对From,但针对Recipient生成给定消息来源/目的地):是的,它们取决于频道。我在SO上做了详细的回答:Bot Framework User Identification

  3. 在网聊的情况下是的

  4. 是,保存对话框堆栈状态,以便您可以继续对话。 &#34;说我刷新页面,我是否能够检索对话框堆栈的状态并从那里恢复对话?&#34;:如果你有相同的细节(channelId + conversationId,userId)你应该是的。例外是webchat / directLine,您必须实现保持相同ID的事实。对于其他渠道,如Slack,Facebook Messenger等,这些项目保持不变,对话框可以在之前的消息交换中停止,