BotFramework确认对话框:用户选Yes后如何向Bot发送隐式自定义消息
在Bot Framework中发送不显示的自定义消息
当然有可行的实现方式!要达成用户选择Yes后,向Bot发送一条不显示在对话中的自定义消息的需求,你可以利用Bot Framework的后台事件活动(Event Activity)——这种类型的活动专门用于Bot和客户端之间的后台通信,完全不会出现在用户的聊天界面里。
具体实现步骤
- 构造隐藏的Event活动:在
res=true的代码块里,创建一个类型为ActivityTypes.Event的活动,你可以自定义事件名称和需要传递的业务数据。 - 发送隐藏消息:使用
SendActivityAsync发送这条活动,用户端不会有任何显示。
修改你原有的Confirm方法代码如下:
private async Task Confirm(IDialogContext context, IAwaitable<bool> result) { var res = await result; await context.PostAsync(res ? "Proceed" : "Ok then"); if (res) { // 构造不显示的后台事件消息 var hiddenEvent = context.MakeMessage(); hiddenEvent.Type = ActivityTypes.Event; hiddenEvent.Name = "UserConfirmedProceed"; // 自定义事件标识,方便Bot识别 // 在Value中传递任意你需要的自定义数据 hiddenEvent.Value = new { TargetOperation = "StartBusinessTask", TriggerTime = DateTime.UtcNow }; // 发送这条后台消息,用户完全看不到它 await context.SendActivityAsync(hiddenEvent); // 你的后续业务逻辑... } }
如何处理这条隐藏消息
如果需要在Bot的其他逻辑里响应这条隐藏消息,可以在Bot的OnTurnAsync方法中监听Event类型的活动:
public override async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default) { // 监听后台事件活动 if (turnContext.Activity.Type == ActivityTypes.Event) { var eventActivity = turnContext.Activity; if (eventActivity.Name == "UserConfirmedProceed") { // 解析自定义数据并处理 var eventData = eventActivity.Value as JObject; var targetOp = eventData?["TargetOperation"]?.ToString(); // 执行对应的后台操作,比如启动任务、调用内部API等 await ExecuteConfirmedOperation(targetOp); } } // 处理其他常规对话逻辑 await base.OnTurnAsync(turnContext, cancellationToken); }
这种方式是Bot Framework官方支持的标准后台通信方案,既不会干扰用户的对话体验,又能实现Bot内部的消息传递,完全匹配你的需求。
内容的提问来源于stack exchange,提问作者J-K
相关产品推荐
相关产品推荐

