Adaptive Card本地正常但部署至Azure App Service后交互失败求助
Teams Adaptive Card交互本地正常但Azure App Service部署后异常问题
我开发了一款包含通知Bot的Teams应用,该Bot使用Adaptive Card。本地环境中,Adaptive Card的交互会正常触发onInvokeActivity;但部署到Windows操作系统的Azure App Service后出现异常:云端环境中交互走的是onMessage流程,且context.activity.name为空。即使确认待替换的Adaptive Card已存在于invokeResponse的body中,卡片仍显示提示:出现错误,请重试。
原代码(第一段)
const { TeamsActivityHandler, StatusCodes, MessageFactory, CardFactory } = require("botbuilder"); const { updateInstanceState } = require("./merlinOperations"); class TeamsBot extends TeamsActivityHandler { constructor() { super(); this.onMessage(async (context, next) => { console.info("llegamos hasta el onMessage ", context.activity); if (context.activity.name === "adaptiveCard/action") { console.info("Activity information ", context.activity); let invokeResponse = await this.onInvokeActivity(context); console.info("invokeResponse information ", invokeResponse); let message = MessageFactory.attachment(CardFactory.adaptiveCard(invokeResponse.body.value)); message.id = context.activity.replyToId; console.info("new message information ", message); await context.updateActivity(message); } else { await context.sendActivity("Este bot es solo para generar notificaciones desde merlin"); } await next(); }); } async onAdaptiveCardInvoke(context) { try { let invokeResponse = { statusCode: StatusCodes.OK }; if (context.activity.name === "adaptiveCard/action" && context.activity.value.trigger === "manual") { const successInteractionTemplate = await updateInstanceState(context.activity); invokeResponse = InvokeResponseFactory.adaptiveCard(successInteractionTemplate); await context.sendActivity({ type: ActivityTypes.InvokeResponse, value: invokeResponse, }); } else if (context.activity.name === "adaptiveCard/action" && context.activity.value.trigger === "automatic") { const successInteractionTemplate = await validateAdaptiveCardInteraction(context.activity); if (typeof (successInteractionTemplate) !== "undefined") { invokeResponse = InvokeResponseFactory.adaptiveCard(successInteractionTemplate); await context.sendActivity({ type: ActivityTypes.InvokeResponse, value: invokeResponse, }); } } return invokeResponse; } catch (error) { console.error("###ERROR ocurrió en el invoke ", error); const errorResponse = InvokeResponseFactory.errorResponse(StatusCodes.BAD_REQUEST, `An error occurred while processing the action. ${error.message || error}`); console.error("Error response", JSON.stringify(errorResponse, null, 2)); await context.sendActivity({ type: ActivityTypes.InvokeResponse, value: errorResponse, }); return errorResponse; } }; } module.exports.TeamsBot = TeamsBot;
我曾注释掉context.activity.name的判断语句排查,但问题依然存在。还尝试过另一段本地可正常运行的代码(重点调整onAdaptiveCardInvoke事件):
测试代码(第二段)
const { TeamsActivityHandler, StatusCodes, MessageFactory, CardFactory, ActivityTypes } = require("botbuilder"); const { updateInstanceState } = require("./merlinOperations"); const { successInteractionStatusChange } = require('./adaptiveCards/templates'); const { InvokeResponseFactory } = require("@microsoft/teamsfx"); const { HttpStatusCode } = require("axios"); const { AdaptiveCard } = require("@microsoft/adaptivecards-tools"); class TeamsBot extends TeamsActivityHandler { constructor() { super(); this.onMessage(async (context, next) => { if (context.activity.name === "adaptiveCard/action") { let invokeResponse = await this.onInvokeActivity(context); await context.sendActivity({ type: ActivityTypes.InvokeResponse, value: invokeResponse, }); } else { await context.sendActivity("Este bot es solo para generar notificaciones desde merlin"); } await next(); }); } async onAdaptiveCardInvoke(context) { try { if (context.activity.name === "adaptiveCard/action") { let invokeResponse = InvokeResponseFactory.adaptiveCard(successInteractionStatusChange); invokeResponse.statusCode = StatusCodes.OK; await context.sendActivity({ type: ActivityTypes.InvokeResponse, value: invokeResponse, }); return invokeResponse; } } catch (error) { console.info("###ERROR ocurrió en el invoke ", error) const cardRes = { statusCode: StatusCodes.OK, type: 'application/vnd.microsoft.error', value: { message: `ha ocurrido un error ${error.message}` } }; const res = { status: StatusCodes.OK, body: cardRes }; return res; } }; } module.exports.TeamsBot = TeamsBot;
可能的原因及修复建议
- 依赖版本不一致:本地和云端部署的
botbuilder、@microsoft/teamsfx等SDK版本不匹配,导致Activity解析逻辑差异。检查package.json中的依赖版本,确保本地开发环境和Azure部署的版本完全相同。 - Azure请求解析异常:Windows环境下的App Service可能对请求头或Body的解析存在差异,导致
activity.name字段丢失。在onMessage中打印完整的context.activity(包括原始请求元数据),对比本地和云端的请求结构,定位字段丢失的原因。 - 错误的Invoke响应处理:
TeamsActivityHandler会自动处理Invoke响应的发送,无需在onAdaptiveCardInvoke中手动调用context.sendActivity——手动发送会导致重复响应,触发客户端错误。移除所有await context.sendActivity({type: ActivityTypes.InvokeResponse, ...})代码,仅返回InvokeResponse对象即可。 - 错误的事件路由逻辑:不需要在
onMessage中手动处理adaptiveCard/action类型的请求,TeamsActivityHandler会自动将Invoke类型的请求转发到onAdaptiveCardInvoke。删除onMessage中处理Adaptive Card交互的代码,让请求自然走正确的事件流程。
修复后的示例代码
const { TeamsActivityHandler, StatusCodes, MessageFactory } = require("botbuilder"); const { updateInstanceState, validateAdaptiveCardInteraction } = require("./merlinOperations"); const { InvokeResponseFactory } = require("@microsoft/teamsfx"); class TeamsBot extends TeamsActivityHandler { constructor() { super(); this.onMessage(async (context, next) => { await context.sendActivity("Este bot es solo para generar notificaciones desde merlin"); await next(); }); } async onAdaptiveCardInvoke(context) { try { const activity = context.activity; if (activity.value.trigger === "manual") { const successTemplate = await updateInstanceState(activity); return InvokeResponseFactory.adaptiveCard(successTemplate); } else if (activity.value.trigger === "automatic") { const successTemplate = await validateAdaptiveCardInteraction(activity); if (successTemplate) { return InvokeResponseFactory.adaptiveCard(successTemplate); } } return { statusCode: StatusCodes.OK }; } catch (error) { console.error("Invoke处理错误:", error); return InvokeResponseFactory.errorResponse(StatusCodes.BAD_REQUEST, `处理操作时出错: ${error.message || error}`); } } } module.exports.TeamsBot = TeamsBot;
内容的提问来源于stack exchange,提问作者PAPIRATA
相关产品推荐
相关产品推荐

