【问题标题】:Begin dialog with ConnectorClient in Microsoft Bot在 Microsoft Bot 中与 ConnectorClient 开始对话
【发布时间】:2020-05-22 03:52:57
【问题描述】:

我有一个外部服务正在以下代码 sn-p 中向团队聊天发送消息:

MicrosoftAppCredentials.TrustServiceUrl("serviceUrl");
var appCredentials = new MicrosoftAppCredentials("app id", appPassword);
var connectorClient = new ConnectorClient("serviceUrl", appCredentials);
await connectorClient.Conversations.SendToConversationAsync("conversationId", activity);

我怎样才能以同样的方式开始对话(现有的 ComponentDialog 并且我可以在 DialogContext 内的 IBot OnTurnAsync 方法中运行它)?

我正在使用 Microsoft Bot Framework 4.2.2。

【问题讨论】:

  • 您是说您想通过主动消息开始对话吗?是什么触发了该代码?您是否有不想更新到最新 SDK 版本的原因?
  • @KyleDelaney 是的,我想启动一个带有主动消息的对话。外部 API(例如 ASP.NET Core 控制器操作方法)触发该代码。我对 SDK 版本没有任何限制,但是在 4.2.2 上编写了一堆代码,我不想影响其他解决方案的部分。是否有可能在 4.2.2 中与主动消息开始对话?我发现了实际使用 IBotFrameworkHttpAdapter 的示例,但这种类型没有出现在 4.2.2
  • 您认为较新的 SDK 版本会影响哪些部分?较新的版本应该是向后兼容的。
  • 你还在做这个吗?
  • @KyleDelaney 我继续努力并执行迁移到 4.9.1。但是遇到了另一个尚未解决的问题(stackoverflow.com/questions/61885871/…)。我们已经更改了关于该任务的说明,现在我们正在发送提醒,要求用户自己开始对话。如果您有任何答案,我很乐意听到任何解决方案!谢谢!

标签: c# .net botframework chatbot microsoft-teams


【解决方案1】:

您不会与连接器客户端开始对话。 Bot Framework 连接器客户端应该只知道 Bot Framework REST API,而不应该关心任何内部机器人逻辑,如对话管理。

Dialogs 基于基于bot state 的对话状态。使用特定密钥在您配置的存储中访问机器人状态。如果您的对话使用的机器人状态类型是用户状态,则密钥将从用户 ID 生成,如果是对话状态,则密钥将具有对话 ID,如果是私有对话状态,则两者都有。当您了解为了继续对话,机器人需要知道对话的上下文时,这是有道理的。当机器人在与一个用户交谈时到达第 4 步时,它不应在与其他用户交谈时从第 5 步开始。这就是为什么使用上下文键访问状态很重要的原因。

通常,访问正确的机器人状态所需的信息可以在适配器创建的轮次上下文中找到。轮次上下文包含传入活动,该活动在其from 属性中具有用户ID,在其conversation 属性中具有对话ID。所以这里真正的问题是如何在没有传入活动时访问正确的机器人状态,因为您正在发送主动消息。

由于您可以使用连接器客户端发送消息,因此您的主动触发器必须有权访问用户 ID 和/或对话 ID。您可以使用此信息来创建虚假的传入活动。然后,您可以像在 api/messages 端点上一样通过适配器运行该活动,或者您可以使用该活动直接构建您自己的转弯上下文。一旦你有了转弯上下文,你就可以像平常一样从一个对话集中创建一个对话上下文。

【讨论】:

    猜你喜欢
    • 2016-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 2017-01-24
    • 2020-02-25
    • 1970-01-01
    • 2017-04-27
    相关资源
    最近更新 更多