You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 10:12:32