如何从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
相关产品推荐
相关产品推荐

