You need to enable JavaScript to run this app. Azure部署Bot Framework后历史用户无法接收主动消息问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 17:45:08