首页 > 解决方案 > Bot Framework - 防止 GatewayTimeout 长时间操作

问题描述

我已经使用botframeworkV4 for .Net 构建了一个机器人,它可以回复用户的电子邮件直接渠道。

但是,有些请求需要超过 15 秒才能完成,因此我会收到一个GatewayTimeout错误: 通道错误日志

这些请求很繁重(从数据库中获取一些数据,通过 API 调用从另一个服务器获取其他数据,处理数据,生成 HTML 并将它们发送回用户......)因此无法缩短流程。

我知道网关超时延迟是设计使然(15 秒),但问题是通道会在一小段时间后自动重试请求,我最终会收到多封电子邮件以获取相同的查询(大约 1 分钟)分开)。

我还注意到,直接回复比电子邮件回复快得多(websocket vs SMTP),因此这主要发生在电子邮件通道中。请注意,根据此评论,电子邮件保持在 300KB以下,但大小很容易接近此限制。

因此,有没有办法:

标签: c#azurebotframework

解决方案


请记住,您的机器人是一个公开 HTTP 端点的 Web 应用程序,发送到您的机器人的每个活动都是一个 API 调用。长时间运行的 API 调用应设计为立即返回响应并异步进行处理。例如,考虑识别文本计算机视觉 API。它只是返回一个操作位置,实际结果将在以后可用。

对于 bot Framework 机器人,在回合结束后向频道发送消息所需要做的就是发送主动消息。设计您的机器人以向用户指示结果即将到来通常也是一个好主意,例如通过发送初步的“处理”消息或键入指示符,但在电子邮件通道的情况下这可能是不需要的。Eric Dahlvang 在您链接到的问题中解释了这一点:

如果开发人员知道响应将花费超过 15 秒,则可以根据通道启动单独的线程来处理长时间运行的进程,在接收线程上返回有效的状态码,当进程完成时,从后台线程发送主动消息。


推荐阅读