MS Bot Framework V4开发Teams机器人点击Hero卡片出现Success通知问题
解决方案:消除Teams弹窗场景下Hero卡片按钮触发的多余Success通知
问题根因
该Success通知是Microsoft Teams对任务模块(即弹出窗口)中未做标准化配置的卡片按钮回传操作的默认反馈。你当前使用的Choice Prompt默认生成的按钮为postBack/imBack类型,仅适配普通对话窗口的交互,在任务模块场景下没有显式返回任务模块处理响应时,就会触发该默认提示。
修复步骤
1. 自定义Choice Prompt的卡片按钮动作类型
不要使用Choice Prompt默认生成的postBack类型按钮,手动为每个选项配置task/submit类型的动作:
// 以C# SDK为例,其他语言SDK逻辑一致 var popupChoices = new List<Choice> { new Choice { Value = "选项1", // 显式指定按钮为任务模块提交类型 Action = new CardAction { Type = ActionTypes.TaskSubmit, Title = "选项1", // 用结构化对象传递选项值,不要直接用字符串 Value = new { selectedOption = "选项1" } } }, // 其他选项同理配置 }; // 用自定义配置的选项初始化Choice Prompt var choicePrompt = new ChoicePrompt(nameof(ChoicePrompt)) { Choices = popupChoices, Style = ListStyle.HeroCard };
2. 处理任务模块提交的Invoke请求
点击task/submit类型的按钮后,Teams会向你的Bot发送invoke类型的活动,而非普通的消息活动,你需要专门处理该请求:
- 在Bot的活动处理逻辑中判断活动类型,如果是
invoke且活动名称为task/submit,解析Value字段拿到用户选择的选项值 - 处理完业务逻辑后,返回标准化的任务模块响应,不要返回普通消息响应:
// 处理task/submit请求后的返回示例 var response = new InvokeResponse { Status = 200, Body = new TaskModuleResponse { Task = new TaskModuleMessageResponse { // 指定关闭任务模块,不会触发默认Success提示 Type = "close" } } }; await turnContext.SendActivityAsync(Activity.CreateInvokeResponseActivity(response), cancellationToken);
3. 适配双场景交互
如果你的Hero卡片需要同时在普通对话窗口和弹窗中使用,可以通过上下文判断当前交互场景:
- 普通对话场景下保持默认的
postBack按钮类型即可,不会触发多余提示 - 弹窗场景下切换为
task/submit按钮类型
内容的提问来源于stack exchange,提问作者Rupinder Singh
相关产品推荐
相关产品推荐

