在 Microsoft Bot 中开始与 ConnectorClient 的对话

Begin dialog with ConnectorClient in Microsoft Bot

我有一个外部服务,它在以下代码片段中向 Teams 聊天发送消息:

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。

您不会开始与连接器客户端的对话。 Bot Framework 连接器客户端只应了解 Bot Framework REST API,不应关注任何内部机器人逻辑,如对话管理。

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

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

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