与 Bot 框架的独白

Monolog with Bot Framework

我们正在为我们的聊天机器人使用 Microsoft Bot Framework。我们的消息控制器是标准的:

public async Task<HttpResponseMessage> Post([FromBody] Activity activity)
{
      HttpResponseMessage response;
      try
      {
        if (activity.Type == ActivityTypes.Message)
        {
            //do some stuff

                await Conversation.SendAsync(activity, () => new RootDialog());
            }
            else
            {
                HandleSystemMessage(activity);
            }

            response = this.Request.CreateResponse(HttpStatusCode.OK);
        }
        catch (Exception ex)
        {
            //do some catching
        }
     return response; 
}

有时候,机器人需要有很长的独白。如果花费的时间太长,我们会收到 502 Bad Gateway 错误。

有什么解决办法吗?

Bot Framework 调用在 15 秒后超时。您的机器人必须在 15 秒内 return 一个成功的 HTTP 状态代码,Direct Line 才能认为消息已成功发送。

如果您的机器人执行大量离线工作或发送多条消息,您应该将这些工作移至后台线程,以便传入请求在 15 秒内完成。

这是正确处理 ASP.Net 和其他托管环境中托管的负载的代码段。

if (HostingEnvironment.IsHosted)
{
    HostingEnvironment.QueueBackgroundWorkItem(c => DoWorkAsync());
}
else
{
    Task.Run(() => DoWorkAsync());
}

...

private async Task DoWorkAsync()
{
    // do some stuff
}

Task.Run 更简单,但 HostingEnvironment.QueueBackgroundWorkItem 阻止 ASP.Net 在这项工作完成之前拆除您的流程。