You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 10:47:01