Adaptive Card用户特定视图刷新未触发InvokeActivity问题
Adaptive Card InvokeActivity未触发排查及URL修改方案
可能的触发失败原因
- 用户ID不匹配:你配置的
refresh.userIds是固定值999111999111999111,如果当前接收卡片的用户ID和这个不一致,自动刷新不会触发。即便是手动点击Refresh按钮,也要确保Bot能正确识别用户ID,否则可能无法匹配触发逻辑。 - 版本兼容性问题:你用的是Adaptive Card 1.4版本,需确认Bot Framework SDK版本和客户端(比如Teams)是否支持
refresh和Action.Execute特性。部分旧版本客户端或SDK可能不兼容,导致Invoke请求无法发送到Bot。 - 方法重写逻辑问题:检查你的Bot类是否正确继承
ActivityHandler,且OnInvokeActivityAsync方法没有被其他逻辑拦截。比如在OnTurnAsync中如果提前返回响应,会导致流程无法走到Invoke处理方法。 - 自动刷新触发条件未满足:
refresh配置中没有设置interval参数,默认只有卡片首次加载给指定用户时才会自动触发Invoke;如果是手动触发,需要确认是否点击了卡片上的Refresh按钮,且按钮的Action.Execute配置正确。 - Bot端点配置错误:确认Bot的服务端点能正常接收Invoke请求,比如Azure Bot Service中通道配置是否正确,有没有开启对应权限允许Invoke请求传递。
解决步骤及URL修改实现
- 修正用户ID配置:将
refresh.userIds替换为当前测试用户的真实ID,或者去掉userIds让所有用户都能触发刷新(如果不需要用户特定视图的话)。 - 验证版本兼容性:升级Bot Framework SDK到最新稳定版,同时确认客户端(如Teams)是最新版本,确保支持Adaptive Card 1.4的
refresh特性。 - 检查方法重写逻辑:确保
OnInvokeActivityAsync方法正确重写,示例如下:
protected override async Task<InvokeResponse> OnInvokeActivityAsync(ITurnContext<IInvokeActivity> turnContext, CancellationToken cancellationToken) { var invokeActivity = turnContext.Activity; if (invokeActivity.Name == "adaptiveCard/action") { var actionData = JsonConvert.DeserializeObject<AdaptiveCardActionData>(invokeActivity.Value.ToString()); // 判断是否是refresh操作 if (actionData.Verb == "refresh") { // 生成更新后的Adaptive Card var updatedCard = GetUpdatedAdaptiveCard(); var attachment = new Attachment { ContentType = AdaptiveCard.ContentType, Content = updatedCard }; // 返回更新后的卡片 return new InvokeResponse { Status = 200, Body = new AdaptiveCardInvokeResponse { Type = "application/vnd.microsoft.card.adaptive", Value = updatedCard } }; } } // 调用基类处理其他Invoke请求 return await base.OnInvokeActivityAsync(turnContext, cancellationToken); }
- 实现URL修改逻辑:在
GetUpdatedAdaptiveCard方法中,修改ActionSet里的Action.OpenUrl的title和url值:
private AdaptiveCard GetUpdatedAdaptiveCard() { // 可以从原卡片模板加载,或者重新构建 var cardJson = @" { ""$schema"": ""http://adaptivecards.io/schemas/adaptive-card.json"", ""type"": ""AdaptiveCard"", ""version"": ""1.4"", ""refresh"": { ""action"": { ""type"": ""Action.Execute"", ""title"": ""Refresh"", ""verb"": ""refresh"", ""data"": { ""CreatedBy"": ""test"" } }, ""userIds"": [""真实用户ID""] }, ""body"": [ // 保留原有body内容 ], ""actions"": [ { ""type"": ""Action.OpenUrl"", ""title"": ""更新后的按钮标题"", ""url"": ""更新后的URL"" } ] }"; return JsonConvert.DeserializeObject<AdaptiveCard>(cardJson); }
- 测试手动触发:点击卡片上的Refresh按钮,查看Bot是否接收到Invoke请求,同时检查网络请求是否正常发送到Bot端点。
内容的提问来源于stack exchange,提问作者MomoCodez
相关产品推荐
相关产品推荐

