Bot调用CRM API超时显示「无法发送」错误的解决方法咨询
解决Bot调用耗时CRM API时的「无法发送」错误问题
嗨,我明白你遇到的问题了——这其实是Bot框架的超时机制在搞鬼。当你的CRM API调用耗时超过了框架默认的超时阈值,它会直接返回「无法发送」的错误,但你的异步任务其实还在后台跑,等数据拿到手后又会正常推送内容。下面给你具体的解决思路和修改后的代码:
为什么会出现这个问题?
大多数Bot框架(比如微软的Bot Framework)都有默认的请求超时设置(一般是15秒左右)。当crmConnect.searchData(prescriber)这个API调用耗时超过了这个时间,框架就会认为当前请求失败,先给用户返回错误提示,但你的异步方法并没有被终止,所以后续拿到数据后还是会执行context.PostAsync推送结果,就造成了先错后正常的矛盾情况。
怎么解决?
我们需要做两件关键的事:
- 先给用户发一个「正在加载」的提示,让用户知道Bot在处理请求,避免困惑;
- 确保API调用的超时设置合理,或者调整框架的超时配置,不让它轻易判定请求失败。
修改后的代码
private async Task GetData(IDialogContext context, IAwaitable<string> result) { string prescriber = await result; // 先给用户一个反馈,告诉他们Bot正在处理请求 await context.PostAsync("正在为您查询数据,请稍候..."); CRMInteraction crmConnect = new CRMInteraction(); // 如果CRMInteraction内部用了HttpClient,记得把超时时间设长一点,避免API调用提前失败 // 举个例子:crmConnect.HttpClient.Timeout = TimeSpan.FromMinutes(1); var prescriberdetail = await crmConnect.searchData(prescriber); this.NormalFlag = true; // 数据拿到后,再发送详细结果 await context.PostAsync(prescriberdetail); context.Done("You are successfully registered."); }
额外的优化小建议
- 如果你的Bot是基于Microsoft Bot Framework,还可以考虑用后台任务或者对话状态持久化,确保就算请求超时了,后续数据回来也能准确推送给对应的用户;
- 看看能不能优化CRM API的调用效率,比如加个缓存、减少返回的数据量,从根源上缩短响应时间;
- 如果框架允许的话,直接调整对话的超时配置,比如在Bot的配置文件里把
ConversationTimeout的值改大一些。
内容的提问来源于stack exchange,提问作者Utpal
相关产品推荐
相关产品推荐

