你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用检测中间件调试机器人

适用于: SDK v4

本文介绍如何使用检测中间件来调试机器人。 有了此功能,Bot Framework Emulator 就可以调试出入机器人的流量并查看机器人的当前状态。 可以使用跟踪消息将数据发送给 Emulator,然后检查任意给定聊天轮次中机器人的状态。

创建机器人快速指南 中,我们使用 EchoBot(使用 Bot Framework v4 在本地构建)来演示如何调试并检查机器人的消息状态。 也可使用 IDE 来调试机器人,或者使用 Bot Framework Emulator 进行调试,但若要调试状态,则需为机器人添加检测中间件。 提供了用于 C#JavaScriptJavaPython 的检测机器人示例。

注意

Bot Framework JavaScript、C# 和 Python SDK 将继续受支持,但 Java SDK 即将停用,最终长期支持将于 2023 年 11 月结束。

使用 Java SDK 构建的现有机器人将继续正常运行。

对于新的机器人生成,请考虑使用 Power Virtual Agents 并参阅选择合适的聊天机器人解决方案

有关详细信息,请参阅机器人构建的未来

先决条件

将 Emulator 更新到最新版本

在使用机器人检测中间件调试机器人之前,将 Emulator 更新到 v4.5 或更高版本。 检查更新的最新版本

若要查看 Emulator 的版本,请在菜单中选择“帮助”,然后选择“关于”。 此时就会看到 Emulator 的当前版本。

更新机器人代码

检测状态和检测中间件在 Startup.cs 文件中配置,然后由适配器使用。

Startup.cs

});

services.AddSingleton<ConversationState>();

// Create the Bot Framework Authentication to be used with the Bot Adapter.

AdapterWithInspection.cs

{
    public class AdapterWithInspection : CloudAdapter
    {
        public AdapterWithInspection(BotFrameworkAuthentication auth, IConfiguration configuration, InspectionState inspectionState, UserState userState, ConversationState conversationState, ILogger<IBotFrameworkHttpAdapter> logger)
            : base(auth, logger)
        {
            // Inspection needs credentials because it will be sending the Activities and User and Conversation State to the emulator
            var credentials = new MicrosoftAppCredentials(configuration["MicrosoftAppId"], configuration["MicrosoftAppPassword"]);

            Use(new InspectionMiddleware(inspectionState, userState, conversationState, credentials));

            OnTurnError = async (turnContext, exception) =>
            {
                // Log any leaked exception from the application.
                logger.LogError(exception, $"[OnTurnError] unhandled error : {exception.Message}");

                // Send a message to the user
                await turnContext.SendActivityAsync("The bot encountered an error or bug.");
                await turnContext.SendActivityAsync("To continue to run this bot, please fix the bot source code.");

                // Send a trace activity, which will be displayed in the Bot Framework Emulator
                await turnContext.TraceActivityAsync("OnTurnError Trace", exception.Message, "https://www.botframework.com/schemas/error", "TurnError");
            };
        }

EchoBot.cs 文件中更新机器人类。

EchoBot.cs

protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
{
    var conversationStateProp = _conversationState.CreateProperty<CustomState>("customState");
    var convProp = await conversationStateProp.GetAsync(turnContext, () => new CustomState { Value = 0 }, cancellationToken);

    var userStateProp = _userState.CreateProperty<CustomState>("customState");
    var userProp = await userStateProp.GetAsync(turnContext, () => new CustomState { Value = 0 }, cancellationToken);

    await turnContext.SendActivityAsync(MessageFactory.Text($"Echo: {turnContext.Activity.Text} conversation state: {convProp.Value} user state: {userProp.Value}"), cancellationToken);

    convProp.Value++;
    userProp.Value++;
}

在本地测试机器人

更新代码后,即可在本地运行机器人并使用两个 Emulator 来测试调试功能:一个用于发送和接收消息,另一个用于在调试模式下检测消息的状态。 若要在本地测试机器人:

  1. 转到机器人在终端的目录,执行以下命令,在本地运行机器人:

    dotnet run
    
  2. 打开 Emulator。 选择“打开机器人”。 在“机器人 URL”中填充 http://localhost:3978/api/messages 以及 MicrosoftAppIdMicrosoftAppPassword 值。 如果使用 JavaScript 机器人,则可在机器人的 .env 文件中找到这些值。 如果使用 C# 机器人,则可在 appsettings.json 文件中找到这些值。 对于 Java 机器人,可以在 application.properties 文件中找到这些值。 选择“连接” 。

  3. 现在,打开另一个 Emulator 窗口。 这第二个 Enulator 窗口将充当调试器。 请按上一步的说明操作。 勾选“在调试模式下打开”,然后单击“连接”。

  4. 此时,你将在调试 Emulator 中看到带有唯一标识符 (/INSPECT attach <identifier>) 的命令。 从调试模拟器复制带有该标识符的整个命令,并将其粘贴到第一个模拟器的聊天框中。

    注意

    将检测中间件添加到机器人的代码中后,每次在调试模式下启动 Emulator 时,都会生成一个唯一标识符。

  5. 现在可以将消息发送到第一个 Emulator 的聊天框中,并在调试 Emulator 中检测消息。 若要检测消息的状态,请单击调试模拟器中的“机器人状态”,然后在右侧的 JSON 窗口中展开“values”。 你将在调试 Emulator 中看到机器人的状态:

    机器人状态

检测在 Azure 中配置的机器人的状态

若要检测在 Azure 中配置的连接到通道(例如 Teams)的机器人的状态,需安装并运行 ngrok

运行 ngrok

目前,你已将 Emulator 更新到最新版本,并在机器人的代码中添加了检测中间件。 下一步是运行 ngrok 并配置本地机器人。 在运行 ngrok 之前,需在本地运行机器人。

若要在本地运行机器人:

  1. 转到机器人在终端中的文件夹,将 npm 注册设置为使用最新版本

  2. 在本地运行机器人。 可以看到机器人公开了一个端口号(例如 3978)。

  3. 打开另一个命令提示符,并转到机器人的项目文件夹。 运行以下命令:

    ngrok http 3978
    
  4. ngrok 现在已连接到本地运行的机器人。 复制安全的 HTTPS 公共 IP 地址。

    ngrok 成功

更新机器人资源

将本地机器人连接到 ngrok 后,可以在 Azure 中配置机器人资源以使用 ngrok URL。

  1. 在 Azure 中转到你的机器人资源。 在左侧菜单上,选择“设置”下的“配置”。

    1. 消息传送终结点设置为已复制的 ngrok IP 地址。 根据需要在 IP 地址后添加 /api/messages。 例如 https://e58549b6.ngrok.io/api/messages

    2. 选择“启用流式处理终结点”。

      设置终结点

    3. 选择“应用”以保存所做的更改。

      提示

      如果“应用”未启用,则可取消勾选“启用流式处理终结点”并选择“应用,”,然后再次勾选“启用流式处理终结点”并选择“保存”。 需确保“启用流式处理终结点”已选中且终结点配置已保存。

  2. 请转到机器人的资源组。

    1. 选择“部署”,然后选择以前成功部署的机器人资源。 从左侧菜单中选择“模板”,获取与机器人关联的 Web 应用的 MicrosoftAppIdMicrosoftAppPassword

      获取输入

    2. 使用 MicrosoftAppIdMicrosoftAppPassword 更新机器人的配置文件(C# 的 appsettings.json 或 JavaScript 的 .env)。

  3. 启动 Emulator,选择“打开机器人”,并在“机器人 URL“中输入 http://localhost:3978/api/messages。 使用添加到机器人配置文件的相同 MicrosoftAppIdMicrosoftAppPassword 填充 Microsoft 应用 IDMicrosoft 应用密码。 然后选择“连接” 。

  4. 正在运行的机器人现已连接到 Azure 中的机器人资源。 若要在Web 聊天中测试 Azure 中的机器人,请转到机器人资源,选择“在Web 聊天中测试”,然后将消息发送到机器人。

启用调试模式

  1. 在 Emulator 中,选择“调试”,然后选择“开始调试”。

  2. 在“机器人 URL”中输入 ngrok IP 地址(请勿忘记添加 /api/messages)(例如 https://e58549b6.ngrok.io/api/messages)。

    1. 对于“Microsoft 应用 ID”,请输入机器人的应用 ID。
    2. 对于“Microsoft 应用密码”,请输入机器人的应用机密。
    3. 确保还勾选“在调试模式下打开”
    4. 选择“连接” 。
  3. 启用调试模式后,Emulator 将生成 UUID。 UUID 是一个独一无二的 ID,每次在 Emulator 中启动调试模式时,就会生成它。

  4. 复制 UUID 并将其粘贴到通道聊天框的“在 Web 聊天中进行测试。 此时会在聊天框中看到“已附加到会话,将复制所有流量进行检测”这条消息。

可以将消息发送到已配置通道的聊天框中,开始调试机器人。 本地 Emulator 会自动使用所有用于调试的详细信息来更新消息。 若要检测机器人的消息状态,请单击“机器人状态”,然后在右侧的 JSON 窗口中展开“values”。

debug-inspection-middleware

后续步骤