MS Teams长期未交互用户主动通知失败:会话ID失效问题问询
关于MS Teams机器人主动通知会话ID失效的问题
我们使用Microsoft Bot Framework SDK v4构建了一款机器人,实现了通过MS Teams向用户发送主动通知(Proactive notifications)的功能。按照微软建议,我们将用户的会话ID(conversation ID)存储在数据库中,触发通知时取出该ID执行发送操作。
一切运行正常,但部分长期(6-10个月)未与机器人聊天的用户无法接收通知。排查发现这类用户的Teams聊天记录已消失,让用户重新发消息给机器人后,以下代码会生成新的会话引用(Conversation Reference)对象存入数据库,此时就能正常发送通知:
protected override async Task OnMembersAddedAsync(IList<ChannelAccount> membersAdded, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken) { foreach (var member in membersAdded) { if (member.Id != turnContext.Activity.Recipient.Id && !(turnContext.Activity.ChannelId == "directline")) { var userProfile = await _userStateAccessors.GetAsync(turnContext, () => new UserProfile()); var reply = await GenerateWelcomeMessage(turnContext); await turnContext.SendActivityAsync(reply); if (turnContext.Activity.ChannelId == "msteams") { //-- if the user email is not identified or its value is null, call AAD to set the email in the user profile if (string.IsNullOrEmpty(userProfile.Email)) { bool isAuthorized = await authorization.Authorize(turnContext?.Activity?.From?.AadObjectId, turnContext, null); } Task.Run(() => _pushNotification.AddConversationReferenceToDB(turnContext.Activity as Activity, userProfile.Email)); } } } }
咨询问题
- 为何用户长期未与机器人交互时,会话ID会失效?
- 会话ID失效的具体时长(天/小时)是多少?
- 是否有方法可以预防会话ID失效?
问题解答
1. 会话ID失效原因
Teams会自动清理长期处于非活跃状态的一对一聊天会话。当用户超过一定时间不与机器人交互,对应的会话会被标记为废弃,关联的会话ID也随之失效,此时用旧ID发起主动通知自然无法送达。
2. 会话失效时长
微软官方并未公布固定的失效时长,但从实际案例来看,非活跃会话通常会在6-12个月左右被清理,这和你遇到的6-10个月的情况吻合。这个时长可能会根据Teams的后台策略微调,没有绝对固定的数值。
3. 预防会话ID失效的方法
- 定期发起轻量交互:每隔几个月给用户发送一条非打扰式的消息(如“需要帮助随时找我”),维持会话的活跃状态,避免被系统自动清理。
- 存储用户AAD对象ID替代会话ID:当需要发送通知时,通过用户的AAD对象ID调用Teams API重新创建会话。这种方式不依赖旧会话ID,只要用户在租户内存在,就能发起新的会话通知。
- 处理通知失败场景:在主动通知发送失败时,标记对应的用户记录,后续可以通过Teams标签、企业邮件等渠道提示用户重新给机器人发消息,生成新的会话ID后更新数据库记录。
内容的提问来源于stack exchange,提问作者SDR
相关产品推荐
相关产品推荐

