连接 ETIMEDOUT 137.116.128.188:443 用于 bot FRAMEWORK,可以扩展
connect ETIMEDOUT 137.116.128.188:443 for bot FRAMEWORK, can be extended
所以我有一个请求预计 运行 至少 1 分钟。在它给出响应之前
为了帮助用户在我的请求仍在 运行ning 时不做任何事情,我设置了一些 sendTyping 活动:
用于审查生产代码工作敏感信息
,这通常是我的代码的样子:
var queryDone = "No";
var xmlData = '';
let soappy = soapQuery("123", "456", "789","getInfo");
soappy.then(function (res) {
queryDone = 'Yes';
xmlData = res;
console.log(xmlData);
}, function (err) {
queryDone = 'Timeout';
})
while (queryDone == 'No') {
await step.context.sendActivity({ type: 'typing' });
}
其中 soapQuery()
是一个函数,它发送 returns POST 请求,如下所示:
return new Promise(function (resolve, reject) {
request.post(options, function (error, response, body) {
if (!error && response.statusCode == 200) {
resolve(body);
}
else {
reject(error);
}
})
})
问题是因为这 1 分钟的响应,(由于我的请求的大量数据和验证,服务器需要至少 1 分钟来处理它,这真的没有商量余地)。
尽管 1 分钟后,控制台确实打印了响应,遗憾的是甚至在此之前,机器人已经超时。
有什么建议可以解决这个问题,或者延长机器人的时间吗?
我需要 sendtyping activity 以便用户了解请求尚未完成。再一次,我的请求确实需要 1 分钟才能响应。
谢谢!
因此,发生这种情况的原因是 HTTP 请求在 Bot Framework 中的工作方式与您预期的略有不同。 Here's how it works:
基本上,您的场景中发生的情况是:
- 用户发送 HTTP POST
- Bot 调用您的
soapQuery
- Bot 开始发送输入指示符
soapQuery
完成
- Bot 最终从步骤 #1 向 HTTP POST 发送 HTTP 响应,在请求已经超时后,这发生在 15 秒后
要解决这个问题,我会:
- 使用
showTypingMiddleware
连续自动发送输入指示器,直到机器人发送另一条消息(这摆脱了阻塞 while
循环)
- 一旦
soapQuery
完成,机器人将失去对话的上下文,因此您的 soappy.then()
函数将需要发送 proactive message. To do so, you'll need to save a reference to the conversation prior to calling soappy()
, and then within the then()
function, you'll need to use that conversationReference to send the proactive message to the user.
但是请注意,我在上面链接的示例中的机器人在 api/notify
端点上收到请求后会调用主动消息。你的不需要那样做。它只需要使用类似的代码发送主动消息。 Here's some more documentation on Proactive Messages
所以我有一个请求预计 运行 至少 1 分钟。在它给出响应之前
为了帮助用户在我的请求仍在 运行ning 时不做任何事情,我设置了一些 sendTyping 活动:
用于审查生产代码工作敏感信息 ,这通常是我的代码的样子:
var queryDone = "No";
var xmlData = '';
let soappy = soapQuery("123", "456", "789","getInfo");
soappy.then(function (res) {
queryDone = 'Yes';
xmlData = res;
console.log(xmlData);
}, function (err) {
queryDone = 'Timeout';
})
while (queryDone == 'No') {
await step.context.sendActivity({ type: 'typing' });
}
其中 soapQuery()
是一个函数,它发送 returns POST 请求,如下所示:
return new Promise(function (resolve, reject) {
request.post(options, function (error, response, body) {
if (!error && response.statusCode == 200) {
resolve(body);
}
else {
reject(error);
}
})
})
问题是因为这 1 分钟的响应,(由于我的请求的大量数据和验证,服务器需要至少 1 分钟来处理它,这真的没有商量余地)。
尽管 1 分钟后,控制台确实打印了响应,遗憾的是甚至在此之前,机器人已经超时。
有什么建议可以解决这个问题,或者延长机器人的时间吗?
我需要 sendtyping activity 以便用户了解请求尚未完成。再一次,我的请求确实需要 1 分钟才能响应。
谢谢!
因此,发生这种情况的原因是 HTTP 请求在 Bot Framework 中的工作方式与您预期的略有不同。 Here's how it works:
基本上,您的场景中发生的情况是:
- 用户发送 HTTP POST
- Bot 调用您的
soapQuery
- Bot 开始发送输入指示符
soapQuery
完成- Bot 最终从步骤 #1 向 HTTP POST 发送 HTTP 响应,在请求已经超时后,这发生在 15 秒后
要解决这个问题,我会:
- 使用
showTypingMiddleware
连续自动发送输入指示器,直到机器人发送另一条消息(这摆脱了阻塞while
循环) - 一旦
soapQuery
完成,机器人将失去对话的上下文,因此您的soappy.then()
函数将需要发送 proactive message. To do so, you'll need to save a reference to the conversation prior to callingsoappy()
, and then within thethen()
function, you'll need to use that conversationReference to send the proactive message to the user.
但是请注意,我在上面链接的示例中的机器人在 api/notify
端点上收到请求后会调用主动消息。你的不需要那样做。它只需要使用类似的代码发送主动消息。 Here's some more documentation on Proactive Messages