Azure AI 机器人服务机器人的常规故障排除

适用于: SDK v4

这些常见问题有助于排查常见的机器人开发或操作问题。

如何排查机器人的问题?

  1. 通过 Visual Studio CodeVisual Studio 调试机器人的源代码。
  2. 先使用 Bot Framework Emulator 测试机器人,然后再将其部署到云。
  3. 将机器人部署到类似于 Azure 的云托管平台,然后使用 Azure 门户中机器人仪表板上的内置 Web 聊天控件测试与机器人的连接性。 如果在将机器人部署到 Azure 后遇到问题,可以考虑使用此博客文章:了解 Azure 故障排除和支持
  4. 排除身份验证可能存在问题的可能性。
  5. 在打算与机器人配合使用的 Web Chat、Teams 或任何其他通道上测试机器人。 这将有助于验证端到端的用户体验。
  6. 考虑在具有其他身份验证要求的渠道(例如 Direct Line 或网上聊天)上测试机器人。
  7. 查看如何调试机器人和该部分中的其他调试文章。

如何排查身份验证问题?

有关排查机器人身份验证问题的详细信息,请参阅故障排除 Bot Framework 身份验证。

如何测试机器人与通道之间的网络连接?

可以使用以下步骤生成的 IP 地址来验证是否有任何规则阻止了与这些地址的连接。 请参阅检查失败连接上的防火墙跟踪部分

测试从机器人到通道的连接

  1. 在浏览器中转到 Azure 门户

  2. 选择要测试其连接的机器人应用服务。

  3. 在左窗格中的 开发工具 部分,选择 高级工具

  4. 在右窗格中选择 Go 。 将显示 Kudu 信息页。

  5. 在顶部菜单中,选择调试控制台。 然后,在下拉菜单中,选择 CMD。 Kudu 机器人 Web 应用控制台已打开。 有关详细信息,请参阅 Kudu

    kudu cmd 控制台

  6. 如果 DNS 解析正常工作,请运行nslookup directline.botframework.azure.cn并检查。 请注意, nslookup (名称服务器查找)是用于查询域名系统(DNS)以获取域名或 IP 地址映射或其他 DNS 记录的网络管理命令行工具。 如果 DNS 解析正常工作,则对此命令的响应将包含相关信息。

    kudu cmd 控制台机器人通道 dns

    WHOIS IP 查找工具可用于获取有关 IP 地址的信息。

  7. 运行 curl -I directline.botframework.azure.cn。 (此选项 -I 用于获取仅包含标头的响应。双重检查返回 HTTP 状态 301 以验证是否存在连接。

    kudu cmd 控制台 http 301

测试从通道到机器人的连接

由于 curl 无法访问生产站点,并且 directline.botframework.azure.cn 位于公共互联网上,因此必须在模拟模式下使用 curl。 在虚拟专用网络 (VNET) 之外执行下面显示的步骤,例如,使用手机热点。 也请参阅什么是 Azure 虚拟网络?

  1. 运行 nslookup ivr-sr-bot.botapps.amat.com。 如果对此命令的响应包含相关信息,则 DNS 解析将正常工作。

    kudu cmd 控制台通道机器人 dns

  2. 运行 curl -I https://ivr-sr-bot.botapps.amat.com/api/messages 并检查是否返回适当的 HTTP 状态代码(例如,不允许使用 405 方法)。 请求中指定的方法不允许用于由指定的 URI 标识的资源。 这只是一种检查连接的方法。

    kudu cmd 控制台 http 405

  3. 如果未从机器人获取响应,请记下客户端的 IP 地址。

检查失败连接上的防火墙跟踪

使用来自 nslookup ivr-sr-bot.botapps.amat.comnslookup directline.botframework.azure.cn 的IP地址,检查是否存在阻止在任一方向上与这些地址建立连接的规则。

我使用的是 Bot Framework SDK for .NET。 如何排查机器人的问题?

查找异常

在 Visual Studio 2019 中,转到“调试”>“Windows”>“异常设置”。 在“异常设置”窗口中,选中“公共语言运行时异常”旁边的“引发时中断”复选框。 当存在引发的异常或未处理的异常时,还可能会在“输出”窗口中看到诊断输出。

查看调用堆栈

在 Visual Studio 中,可以选择是否调试仅我的代码。 检查完整的调用堆栈可能会对问题提供其他见解。

确保所有对话框方法都以处理下一条消息的计划结束

所有对话框步骤都需要馈送到瀑布框的下一步中,或者需要终止当前对话框,以便将其从堆栈中弹出。 如果某个步骤未正确处理,则聊天不会像预期的那样继续。 若要详细了解对话框,请参阅有关对话框的概念文章。

导致出现 HTTP 状态代码 429“请求过多”错误的原因是什么?

HTTP 状态代码 429 的错误响应表示在给定的时间内发出了太多请求。 响应的正文应包含问题的说明,也可以指定请求之间所需的最小间隔。

为何用户收不到我的机器人消息?

在响应中生成的消息活动必须正确处理,否则到不了预期的目标。 在多数情况下,你不需进行显式处理;SDK 会为你处理此消息活动。

为了正确处理某项活动请包括相应的对话 ID 详细信息以及有关发送者的详细信息。 大多数情况下,发送消息活动是为了响应已经到达的消息活动。 因此,可以从入站活动中获取寻址详细信息。

如果检查跟踪或审核日志,则可通过检查来确保消息正确寻址。 否则,请在机器人中设置一个断点,看看是在何处为消息设置的 ID。

如何在 ASP.NET 中运行后台任务?

在某些情况下,你可能希望启动一个需要等待几秒钟的异步任务,然后执行一些代码以清除用户配置文件或重置会话/对话状态。 有关如何实现此目的的详细信息,请参阅如何在 ASP.NET 中运行后台任务。 具体而言,请考虑使用HostingEnvironment.QueueBackgroundWorkItem

我的机器人对收到的第一条消息的响应速度很慢。 怎样才能加快它的响应速度?

机器人是 Web 服务和一些托管平台(包括 Azure),会在一段时间内没有收到流量时自动将服务置于休眠状态。 如果你的机器人发生这种情况,它必须在下次收到消息时重启,这会使其响应速度比其已在运行的响应速度慢得多。

借助某些托管平台,你可以配置服务,以使其不会进入休眠状态。 如果机器人托管在 Azure AI 机器人服务 Web 应用上,请导航到 Azure 门户中的机器人服务,选择“应用程序设置”,然后选择 Always on。 大多数(但不是全部)服务计划都提供此选项。

如何保证消息传递顺序?

Bot Framework 将尽可能地保留消息顺序。 例如,如果先发送消息 A 并等待该 HTTP 操作完成,然后再发起另一个 HTTP 操作以发送消息 B,则某些通道(如短信和电子邮件)不保证消息到用户设备的顺序。

为什么我的消息文本被部分删除?

Bot Framework 和许多通道就像使用 Markdown 对文本进行格式化一样来解释文本。 检查文本是否包含可能被解释为 Markdown 语法的字符。

如何在同一个机器人服务终结点支持多个机器人?

示例演示了如何使用正确的 MicrosoftAppCredentials 配置 Conversation.Container 并使用简单的 MultiCredentialProvider 来验证多个应用 ID 和密码。

标识符如何在 Bot Framework 中运行?

有关 Bot Framework 中标识符的详细信息,请参阅 Bot Framework 标识符指南

如何访问用户 ID?

Bot Framework 通道在用户发送的任何活动的“from.Id”字段中提供用户的 ID。 短信和电子邮件消息会提供此属性中的原始用户 ID。 某些通道会掩盖 from.Id 属性,这样,该属性包含的用户的唯一 ID 便会不同于通道中的用户 ID。 如果需要连接到现有帐户,可以使用登录卡并实施自己的 OAuth 流,以将用户 ID 连接到自己服务的用户 ID。

如何通过我的机器人使用经过身份验证的服务?

有关 Microsoft Entra ID 身份验证,请参阅将 身份验证添加到机器人 教程。

注意

如果向机器人添加身份验证和安全功能,则应确保在代码中实现的模式符合应用程序相应的安全标准。

如何仅限预先确定的用户列表访问我的机器人?

某些通道(例如 SMS 和电子邮件)提供未区分范围的地址。 在这些情况下,来自用户的消息将包含 from.Id 属性中的原始用户 ID。

其他通道提供范围地址或租户地址,以防止机器人提前预测用户的 ID。 在这些情况下,需要通过登录链接或共享机密对用户进行身份验证,以确定他们是否有权使用机器人。

为什么我的 Direct Line 1.1 会话会在每条消息后重新开始?

注意

本部分不适用于 Direct Line 协议的最新版本,即 3.0

如果你的 Direct Line 会话似乎在每条消息后重新开始,则 from 属性可能缺失或 Direct Line 客户端发送给机器人的消息中包含 null。 当 Direct Line 客户端发送缺少 from 属性或包含 null 的消息时,Direct Line 服务会自动分配一个 ID,因此客户端发送的每条消息都将显示为来自不同的新用户。

若要解决此问题,请将 Direct Line 客户端发送的每条消息中的 from 属性设置为唯一表示发送消息的用户的稳定值。 例如,如果用户已登录到网页或应用,则可以将该现有的用户 ID 用作用户发送的消息中 from 属性的值。 或者,可以选择在页面加载或应用程序加载时生成随机用户 ID,将该 ID 存储在 Cookie 或设备状态中,并将该 ID 用作用户发送的消息中 from 属性的值。

导致 Direct Line 3.0 服务使用 HTTP 状态代码 502“错误的网关”进行响应的原因是什么?

当 Direct Line 3.0 尝试联系你的机器人但请求未成功完成时会返回 HTTP 状态代码 502。 这个错误表明,机器人要么返回了一个错误,要么请求超时。有关机器人生成的错误的详细信息,请转到 Azure 门户中的机器人仪表板,然后选择受影响通道的“问题”链接。 如果为机器人配置了 Application Insights,则还可以在那里找到详细的错误信息。

创建机器人时,为什么会收到 Authorization_RequestDenied 异常?

通过 Microsoft Entra ID 门户管理创建 Azure AI 机器人服务机器人的权限。 若未在 Microsoft Entra ID 管理中心中正确配置权限,则在尝试创建机器人服务时,用户将收到 Authorization_RequestDenied 异常。

首先检查你是否是目录的“来宾”:

  1. 登录到 Azure 门户
  2. 选择 所有服务,然后搜索活动
  3. 选择 Microsoft Entra ID
  4. 选择用户
  5. 从列表中查找用户,并确保用户类型不是来宾

Microsoft Entra ID 用户类型

确认你不是来宾后,然后确保 Active Directory 中的用户可以创建机器人服务,目录管理员需要配置以下设置:

  1. 登录 Microsoft Entra 管理中心。 转到用户和组,然后选择用户设置
  2. 应用注册部分下,将用户可以注册应用程序设置为。 这允许目录中的用户创建机器人服务。
  3. 外部用户部分下,将来宾用户权限受限设置为。 这允许目录中的来宾用户创建机器人服务。

Microsoft Entra ID 管理中心

为什么不能迁移我的机器人?

如果机器人已在 dev.botframework.azure.cn 中注册,并且你想要将其迁移到 Azure,但在迁移机器人时遇到问题,则可能是因为机器人属于默认目录以外的目录。 请尝试以下步骤:

  1. 从目标目录添加不是默认目录成员的新用户(通过电子邮件地址),在作为迁移目标的订阅上授予用户参与者角色。

  2. 开发人员门户,添加用户的电子邮件地址,作为应迁移的机器人的共有者。 然后注销。

  3. 以新用户身份登录到开发人员门户然后继续迁移机器人。

从哪里可以获得更多帮助?

  • 搜索 Stack Overflow 上以前回答过的问题中的信息,或使用 botframework 标记发布你自己的问题。 Stack Overflow 有一些准则,例如要求具有描述性的标题、完整而简明的问题陈述以及重现问题的足够详细信息。 功能请求或过于宽泛的问题都是偏离主题的;新用户应访问 Stack Overflow 帮助中心了解更多详细信息。
  • 请查阅 GitHub 中的 BotBuilder 问题,了解 Bot Framework SDK 的已知问题,或报告新问题。
  • BotBuilder 社区的 Gitter讨论。