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

如何从Bot Framework Composer生成代码中访问turnContext获取对话日志?

在Bot Framework Composer中获取对话轮次文本的解决方案

以下是几种无需依赖原生SDK文档、适配Composer生成代码的实现方式:

1. 用Composer内置跟踪功能快速记录

无需修改代码,在Composer的对话流程中添加「跟踪」动作,直接将用户输入(@turn.activity.text)或机器人输出内容作为跟踪消息。这些日志会实时显示在Bot Framework Emulator的「跟踪」面板中,满足基础日志需求。

2. 自定义中间件拦截对话轮次(推荐)

Composer本质基于Bot Framework v4,可通过自定义中间件拦截每个对话轮次的turnContext:

  • 创建中间件类(如ConversationLoggingMiddleware.cs):
    using Microsoft.Bot.Builder;
    using Microsoft.Bot.Schema;
    using System.Threading;
    using System.Threading.Tasks;
    
    public class ConversationLoggingMiddleware : IMiddleware
    {
        public async Task OnTurnAsync(ITurnContext turnContext, NextDelegate next, CancellationToken cancellationToken = default)
        {
            // 获取用户输入文本
            if (turnContext.Activity.Type == ActivityTypes.Message)
            {
                string userText = turnContext.Activity.Text;
                // 这里执行日志逻辑,如写入文件/数据库
            }
    
            // 监听机器人回复
            turnContext.OnSendActivities(async (ctx, activities, nextSend) =>
            {
                foreach (var activity in activities)
                {
                    if (activity.Type == ActivityTypes.Message)
                    {
                        string botText = activity.Text;
                        // 记录机器人回复日志
                    }
                }
                return await nextSend();
            });
    
            await next(cancellationToken);
        }
    }
    
  • 在项目的Startup.cs中注册中间件:
    public void ConfigureServices(IServiceCollection services)
    {
        // 其他原有代码...
        services.AddSingleton<IMiddleware, ConversationLoggingMiddleware>();
    }
    

3. 修改Composer生成的Bot类

找到项目Bot文件夹下的Bot.cs,重写ActivityHandler的方法直接获取内容:

protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
{
    // 获取当前轮次用户输入
    string userInput = turnContext.Activity.Text;
    // 执行日志记录逻辑
    await base.OnMessageActivityAsync(turnContext, cancellationToken);
}

protected override async Task<ResourceResponse[]> OnSendActivitiesAsync(ITurnContext turnContext, Activity[] activities, CancellationToken cancellationToken)
{
    // 拦截机器人要发送的所有消息
    foreach (var activity in activities)
    {
        if (activity.Type == ActivityTypes.Message)
        {
            string botResponse = activity.Text;
            // 记录机器人回复
        }
    }
    return await base.OnSendActivitiesAsync(turnContext, activities, cancellationToken);
}

关于Controller中对象为空的说明

SkillController.cs和BotController.cs是请求入口层,此时Activity还未经过Bot Framework的完整处理流程,turnContext尚未初始化完成,因此直接打印会出现空值。建议使用上述中间件或Bot类重写的方式,这些方法处于Bot Framework的处理生命周期内,可获取完整的turnContext和Activity信息。

内容的提问来源于stack exchange,提问作者vicky

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 21:45:40