Azure部署Bot Framework后历史用户无法接收主动消息问题咨询
问题根因
你当前代码中的CONVERSATION_REFERENCES字典采用运行时内存存储,每次Bot部署重启、实例扩缩容都会直接清空内存数据,所有历史用户会话引用全部丢失,因此无法给老用户发送主动消息。只有用户在部署后重新发送消息,新的会话引用才会被写入内存恢复主动消息能力,这是问题的核心原因。
修复方案
1. 替换为持久化存储存储会话引用
停止使用内存存储会话引用,改为接入外部持久化存储,部署在Azure环境下可优先选择Azure Cosmos DB、Azure Table Storage、Redis等服务,适配性更高。
需要调整两处核心逻辑:
- 新增会话写入逻辑:每次用户向Bot发送消息、触发新会话时,将获取到的
conversation_reference写入持久化存储,以用户ID/会话ID作为唯一键,重复触发时直接覆盖更新即可 - 修改主动消息读取逻辑:发送主动消息前,先从持久化存储拉取全量有效会话引用,再遍历执行发送操作
2. 优化主动消息发送可靠性
你现有代码中的AppCredentials.trust_service_url逻辑是正确的,可额外补充两点优化:
- 遍历发送时添加异常捕获,遇到失效会话(如用户已删除Bot、会话过期)直接从持久化存储中清理该引用,减少后续无效请求
- 确认
APP_ID与Bot服务的应用凭证完全匹配,多租户场景下需额外校验权限范围
修改后的代码示例
# 需提前实现持久化存储的读写方法:get_all_conversation_refs()读取全量会话引用、delete_invalid_conversation_ref()删除失效引用 async def _send_proactive_message(txt): conversation_references = await get_all_conversation_refs() for conversation_reference in conversation_references: try: AppCredentials.trust_service_url(conversation_reference.service_url) await ADAPTER.continue_conversation( conversation_reference, lambda turn_context: turn_context.send_activity(txt), APP_ID ) except Exception: # 发送失败判定为会话失效,清理无效数据 await delete_invalid_conversation_ref(conversation_reference.id)
可选配置补充
如果你的Bot使用Azure Bot Service消费级托管方案,可在配置页开启始终打开开关,避免实例冷启动导致的临时主动消息发送失败。
内容的提问来源于stack exchange,提问作者Aman Khandelwal
相关产品推荐
相关产品推荐

