0

我们正在为我们的聊天机器人使用 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 错误。

有什么解决方案吗?

4

1 回答 1

2

Bot Framework 调用在 15 秒后超时。您的机器人必须在 15 秒内返回成功的 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 在此工作完成之前拆除您的进程。

于 2017-01-28T16:07:08.087 回答