Botframework 关于保存bot状态的问题

Botframework 关于保存bot状态的问题,botframework,Botframework,我通读了有关保存状态数据的内容。关于这一点,我有一些问题:- 让我们以通过浏览器频道公开的机器人为例:- 存储的数据的生命周期是多少?例如,当bot使用context.ConversationData.SetValue(..)保存数据时,会话结束时(当用户刷新页面时)是否清除数据 “来自”活动的“来自”对象具有Id和名称。这些信息是否在每次聊天会话开始时由频道生成?例如,如果我正在与机器人聊天,然后刷新网页,现在我的Id和姓名是否会更改 关于谈话的问题也是一样。如果我刷新页面并再次开始对话,是否

我通读了有关保存状态数据的内容。关于这一点,我有一些问题:- 让我们以通过浏览器频道公开的机器人为例:-

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

  • “来自”活动的“来自”对象具有Id和名称。这些信息是否在每次聊天会话开始时由频道生成?例如,如果我正在与机器人聊天,然后刷新网页,现在我的Id和姓名是否会更改

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

    非常感谢

    快速回答:

  • 据我所知,没有净化。您可以检查Azure
    DocumentDbBotDataStore
    TableBotDataStore
    的实现。根据我的实现,我看到存储的数据中有一个
    Timestamp
    列,因此您可以基于该列进行清理

  • 生成
    Id
    Name
    字段(适用于
    From
    ,但也适用于
    收件人
    ):是,它们取决于频道。我做了一个详细的回答,关于这一点:

  • 是的,在网络帽的情况下

  • 是的,对话框堆栈状态已保存,以便您可以继续对话。“假设我刷新页面,我是否能够检索对话框堆栈的状态并从此处恢复对话?”:如果您具有相同的详细信息(channelId+conversationId,userId),则应该是。webchat/directLine是一个例外,您必须实现保持相同ID的事实。对于Slack、FacebookMessenger等其他频道,这些项目保持不变,对话框可以在之前的消息交换中停止的位置继续


  • 您好,我希望下面的答案对您有用:

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

    ANS:->

    根据Bot框架的指导方针,州API处于折旧状态。您必须使用自己的状态管理服务来维护Bot的状态。参考:

    因此,假设您使用表存储或SQL数据库来存储bot,在这种情况下,只要存储帐户和数据库可用,数据就会持久存在

    2. “来自”活动的“来自”对象具有Id和名称。这些是生成的吗 每次聊天会话开始时按频道播放?例如,如果我 正在与机器人聊天,然后刷新网页,现在将我的Id和 你的名字变了吗

    ANS:->

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

    • 网络聊天:它将是空id
    • Skype:它将是Skype id和用户名
    • DirectLine:您可以根据需要定义自己的id和名称
    3. 关于对话的问题也是一样。如果我刷新页面并再次开始对话,是否会获得新的对话ID

    ANS:->

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

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

    ANS:->

    5. 若然,原因为何?假设我刷新页面,我是否能够检索对话框堆栈的状态并从那里恢复对话

    ANS:->

    正如前面所暗示的,您需要将bot迁移到使用DirectLine API而不是webchat通道。由于webchat不支持历史记录,因此使用DirectLine

    请参考Microsoft提供的指南和GitHub上提供的示例。

    @user3740951,Grad,你觉得我的答案很有用。谢谢你抽出时间回答我的问题!跟进第一个答案。关于不推荐使用的状态服务API,我对我可以使用和不能使用的API有点困惑:-1。我可以使用StateClient吗?2.stateClient.BotState.DeleteStateForUser()、GetUserData()、SetUserData()、GetConversationData()3。stateClient.BotState.GetUserDataAsync()4。IDialogContext.UserData.GetValue()是。botframeworkbeta提供了包括存储空间在内的免费状态管理。因此,现在不推荐使用这种方法,这意味着您需要处理的只是存储bot数据的方式,仅此而已。因此,上面所有的API都不推荐使用,为了处理Bot数据,我需要编写自己的代码来连接到某个数据库并在其中写入数据。正确-上面列出的所有API都将无法使用。但是您不需要编写自己的方法。现在,您需要提供有关存储状态数据的数据库/存储帐户的信息。同样,可以使用Application\u Start:UpdateContainer方法轻松完成。您可以使用context.UserData或context.ConversationData访问状态数据。谢谢