Microsoft Bot Framework无活动会话超时:已释放对象异常求助
解决方案:TurnContext已释放后的消息发送问题
首先明确:TurnContext 是绑定单次对话请求的对象,请求结束后框架会自动回收释放,无法手动延迟其释放——强行保留会导致资源泄漏,这也是你报错的核心原因。正确的做法是通过对话引用重新创建上下文来发送消息,具体方案如下:
保存对话引用(ConversationReference)而非TurnContext
在首次处理用户请求时,从Activity中提取对话引用并保存(可存在内存缓存、数据库或其他持久化存储中),代码示例:// 在正常对话流程中获取并保存对话引用 var conversationReference = turnContext.Activity.GetConversationReference(); // 将conversationReference存入缓存,关联用户/对话标识 await _cache.SetAsync($"conv_ref_{conversationReference.User.Id}", conversationReference);延迟回调中使用对话引用发起新对话轮次
当延迟任务触发时,通过BotAdapter的ContinueConversationAsync方法,利用保存的对话引用创建新的上下文,再发送消息:// 从缓存中取出对话引用 var conversationReference = await _cache.GetAsync<ConversationReference>($"conv_ref_{userId}"); if (conversationReference != null) { await _adapter.ContinueConversationAsync(_appId, conversationReference, async (newContext) => { await newContext.SendActivityAsync("再过1分钟聊天将自动关闭"); // 若需要关闭对话,可在此处调用对应逻辑,比如发送结束活动 await newContext.SendActivityAsync(MessageFactory.Text("聊天已自动关闭"), CancellationToken.None); }, CancellationToken.None); }额外注意事项
- 确保保存的ConversationReference包含完整的渠道信息(比如Teams的tenantId、微信的openId等),不同渠道的对话引用结构有差异,需完整提取。
- 延迟任务的触发逻辑要和对话状态联动,比如如果用户在延迟期间有新活动,要取消原延迟任务,避免误发提醒。
内容的提问来源于stack exchange,提问作者Danish rabbani
相关产品推荐
相关产品推荐

