Создание и отправка модуля задач

Важно!

Примеры кода в этом разделе основаны на 4.6 и более поздних версиях SDK Bot Framework. Если вы ищете документацию для более ранних версий, см. раздел Расширения обмена сообщениями — раздел v3 SDK в папке Ресурсы документации.

Модуль задач можно создать с помощью адаптивной карты или встроенного веб-представления. Чтобы создать модуль задач, необходимо выполнить процесс, называемый начальным запросом на вызов. Этот документ охватывает начальный запрос на вызов, свойства активности полезной нагрузки при вызове модуля задачи из чата 1:1, группового чата, канала (новая должность), канала (ответ на поток) и командного окна.

Примечание

Если вы не заполняете модуль задач параметрами, определенными в манифесте приложения, необходимо создать модуль задач для пользователей с помощью адаптивной карты или встроенного веб-представления.

Начальный запрос на вызов

В процессе первоначального запроса на вызов служба получает объект типа, и необходимо ответить объектом, содержащим адаптивную карту или URL-адрес встроенного Activity composeExtension/fetchTask task веб-представления. Наряду со стандартными свойствами активности бота, начальная загрузка ссылок содержит следующие метаданные запроса:

Имя свойства Назначение
type Тип запроса. Это должно быть invoke .
name Тип команды, выданной службе. Это должно быть composeExtension/fetchTask .
from.id ID пользователя, отправив запрос.
from.name Имя пользователя, отправив запрос.
from.aadObjectId Azure Active Directory объекта пользователя, отправив запрос.
channelData.tenant.id Идентификатор клиента Azure Active Directory.
channelData.channel.id ID канала (если запрос был сделан в канале).
channelData.team.id Team ID (если запрос был сделан в канале).
value.commandId Содержит ID вызываемой команды.
value.commandContext Контекст, который вызвал событие. Это должно быть compose .
value.context.theme Клиентская тема пользователя, полезная для встраиваемого форматирования веб-просмотра. Он должен быть default или contrast dark .

Пример

Код начального запроса на вызов приводится в следующем примере:

{
  "type": "invoke",
  "id": "f:bc319b1d-571a-194d-9ffb-11d7ab37c9ff",
  "from": {
    "id": "29:1aBjVi5MwCFfhPIV03E5uDdfpBFXp_2Yz-sjrvVg12oavg96cqpE_DiMhOpmN9zHeZpYbJcuUEKuSDy2AYWPz1A",
    "name": "Olo Brockhouse",
    "aadObjectId": "b130c271-d2eb-45f9-83ab-9eb3fe3788bc"
  }
  "channelData": {
    "tenant": {
      "id": "0d9b645f-597b-41f0-a2a3-ef103fbd91bb"
    },
    "source": {
      "name": "compose"
    }
  },
  "value": {
    "commandId": "Test",
    "commandContext": "compose",
    "requestId": "fe50f49e5c74440bb2ebf07f49e9553c",
    "context": {
      "theme": "default"
    }
  },
  "name": "composeExtension/fetchTask"

Свойства активности полезной нагрузки при вызове модуля задач из чата 1:1

Свойства активности полезной нагрузки при вызове модуля задач из чата 1:1 перечислены следующим образом:

Имя свойства Назначение
type Тип запроса. Это должно быть invoke .
name Тип команды, выданной службе. Это должно быть composeExtension/fetchTask .
from.id ID пользователя, отправив запрос.
from.name Имя пользователя, отправив запрос.
from.aadObjectId Azure Active Directory объекта пользователя, отправив запрос.
channelData.tenant.id Идентификатор клиента Azure Active Directory.
channelData.source.name Имя источника, из которого вызывается модуль задач.
ChannelData.legacy. replyToId Получает или задает ID сообщения, на которое это сообщение является ответом.
value.commandId Содержит ID вызываемой команды.
value.commandContext Контекст, который вызвал событие. Это должно быть compose .
value.context.theme Клиентская тема пользователя, полезная для встраиваемого форматирования веб-просмотра. Он должен быть default или contrast dark .

Пример

Свойства активности полезной нагрузки при вызове модуля задач из чата 1:1 приводятся в следующем примере:

{
  "type": "invoke",
  "id": "f:bc319b1d-571a-194d-9ffb-11d7ab37c9ff",
  "from": {
    "id": "29:1aBjVi5MwCFfhPIV03E5uDdfpBFXp_2Yz-sjrvVg12oavg96cqpE_DiMhOpmN9zHeZpYbJcuUEKuSDy2AYWPz1A",
    "name": "Olo Brockhouse",
    "aadObjectId": "b130c271-d2eb-45f9-83ab-9eb3fe3788bc"
  }
  "channelData": {
    "tenant": {
      "id": "0d9b645f-597b-41f0-a2a3-ef103fbd91bb"
    },
    "source": {
      "name": "compose"
    }
  },
  "value": {
    "commandId": "Test",
    "commandContext": "compose",
    "requestId": "fe50f49e5c74440bb2ebf07f49e9553c",
    "context": {
      "theme": "default"
    }
  },
  "name": "composeExtension/fetchTask"
}

Свойства активности полезной нагрузки при вызове модуля задач из группового чата

Свойства активности полезной нагрузки при вызове модуля задач из группового чата перечислены следующим образом:

Имя свойства Назначение
type Тип запроса. Это должно быть invoke .
name Тип команды, выданной службе. Это должно быть composeExtension/fetchTask .
from.id ID пользователя, отправив запрос.
from.name Имя пользователя, отправив запрос.
from.aadObjectId Azure Active Directory объекта пользователя, отправив запрос.
channelData.tenant.id Идентификатор клиента Azure Active Directory.
channelData.source.name Имя источника, из которого вызывается модуль задач.
ChannelData.legacy. replyToId Получает или задает ID сообщения, на которое это сообщение является ответом.
value.commandId Содержит ID вызываемой команды.
value.commandContext Контекст, который вызвал событие. Это должно быть compose .
value.context.theme Клиентская тема пользователя, полезная для встраиваемого форматирования веб-просмотра. Он должен быть default или contrast dark .

Пример

Свойства активности полезной нагрузки при вызове модуля задач из группового чата приводятся в следующем примере:

{
  "type": "invoke",
  "id": "f:bf72031f-a17e-f99c-48dc-5c0714950d87",
  "from": {
    "id": "29:1aBjVi5MwCFfhPIV03E5uDdfpBFXp_2Yz-sjrvVg12oavg96cqpE_DiMhOpmN9zHeZpYbJcuUEKuSDy2AYWPz1A",
    "name": "Olo Brockhouse",
    "aadObjectId": "b130c271-d2eb-45f9-83ab-9eb3fe3788bc"
  },
  "conversation": {
    "isGroup": true,
    "conversationType": "groupChat",
    "id": "19:d77be72390a1416e9644261e9064fa00@thread.skype",
    "tenantId": "0d9b645f-597b-41f0-a2a3-ef103fbd91bb"
  },
  "channelData": {
    "tenant": {
      "id": "0d9b645f-597b-41f0-a2a3-ef103fbd91bb"
    },
    "source": {
      "name": "compose"
    }
  },
  "value": {
    "commandId": "Test",
    "commandContext": "compose",
    "requestId": "213167a1e3b6428b93e186ea5407c759",
    "context": {
      "theme": "default"
    }
  },
  "name": "composeExtension/fetchTask"
}

Свойства активности полезной нагрузки при вызове модуля задач из чата собраний

Свойства активности полезной нагрузки при вызове модуля задач из чата собраний приводятся в следующем примере:

{
   "type": "invoke",
   "id": "f:4d271f11-4eed-622f-e820-6d82bf91692f",
   "channelId": "msteams",
   "from": {
      "id": "29:1yLsdbTM1UjxqqD8cjduNUCI1jm8xZaH3lx9u5JQ04t2bknuTCkP45TXdfROTOWk1LzN1AqTgFZUEqHIVGn_qUA",
      "name": "MOD Administrator",
      "aadObjectId": "ef16aa89-5b26-4a2c-aebb-761b551577c0"
   },
   "conversation": {
      "tenantId": "c9f9aafd-64ac-4f38-8e05-12feba3fb090",
      "id": "19:meeting_NTk4ZDY4ZmYtOWEzZS00OTRkLThhY2EtZmUzZmUzMDQyM2M0@thread.v2",
      "name": "Test meeting"
   },   
   "channelData": {
      "tenant": {
         "id": "c9f9aafd-64ac-4f38-8e05-12feba3fb090"
      },
      "source": {
         "name": "compose"
      },
      "meeting": {
         "id": "MCMxOTptZWV0aW5nX05UazRaRFk0Wm1ZdE9XRXpaUzAwT1RSa0xUaGhZMkV0Wm1VelptVXpNRFF5TTJNMEB0aHJlYWQudjIjMA=="
      }
   },
   "value": {
      "commandId": "Test",
      "commandContext": "compose",
      "requestId": "c46a6b53573f42b5bc801716e5ccc960",
      "context": {
         "theme": "default"
      }
   },
   "name": "composeExtension/fetchTask",
}

Свойства активности полезной нагрузки при вызове модуля задач из канала (новая публикация)

Свойства активности полезной нагрузки при вызове модуля задач из канала (новая должность) перечислены следующим образом:

Имя свойства Назначение
type Тип запроса. Это должно быть invoke .
name Тип команды, выданной службе. Это должно быть composeExtension/fetchTask .
from.id ID пользователя, отправив запрос.
from.name Имя пользователя, отправив запрос.
from.aadObjectId Azure Active Directory объекта пользователя, отправив запрос.
channelData.tenant.id Идентификатор клиента Azure Active Directory.
channelData.channel.id ID канала (если запрос был сделан в канале).
channelData.team.id Team ID (если запрос был сделан в канале).
channelData.source.name Имя источника, из которого вызывается модуль задач.
ChannelData.legacy. replyToId Получает или задает ID сообщения, на которое это сообщение является ответом.
value.commandId Содержит ID вызываемой команды.
value.commandContext Контекст, который вызвал событие. Это должно быть compose .
value.context.theme Клиентская тема пользователя, полезная для встраиваемого форматирования веб-просмотра. Он должен быть default contrast , или dark .

Пример

Свойства активности полезной нагрузки при вызове модуля задач из канала (новая должность) приводятся в следующем примере:

{
  "type": "invoke",
  "id": "f:a5fbb109-c989-c449-ee83-71ac99919d4b",
  "from": {
    "id": "29:1aBjVi5MwCFfhPIV03E5uDdfpBFXp_2Yz-sjrvVg12oavg96cqpE_DiMhOpmN9zHeZpYbJcuUEKuSDy2AYWPz1A",
    "name": "Olo Brockhouse",
    "aadObjectId": "b130c271-d2eb-45f9-83ab-9eb3fe3788bc"
  },
  "conversation": {
    "isGroup": true,
    "conversationType": "channel",
    "id": "19:6decf54d86d945e4b3924b63a9161a78@thread.skype",
    "name": "parsable",
    "tenantId": "0d9b645f-597b-41f0-a2a3-ef103fbd91bb"
  },
  "channelData": {
    "channel": {
      "id": "19:6decf54d86d945e4b3924b63a9161a78@thread.skype"
    },
    "team": {
      "id": "19:acca514e83cb497e960e0b014d405336@thread.skype"
    },
    "tenant": {
      "id": "0d9b645f-597b-41f0-a2a3-ef103fbd91bb"
    },
    "source": {
      "name": "compose"
    }
  },
  "value": {
    "commandId": "Test",
    "commandContext": "compose",
    "requestId": "5336640edc7748b28ce2df43f5b45963",
    "context": {
      "theme": "default"
    }
  },
  "name": "composeExtension/fetchTask"
}

Свойства активности полезной нагрузки при вызове модуля задач из канала (ответ на поток)

Свойства активности полезной нагрузки при вызове модуля задач из канала (ответ на поток) перечислены следующим образом:

Имя свойства Назначение
type Тип запроса. Это должно быть invoke .
name Тип команды, выданной службе. Это должно быть composeExtension/fetchTask .
from.id ID пользователя, отправив запрос.
from.name Имя пользователя, отправив запрос.
from.aadObjectId Azure Active Directory объекта пользователя, отправив запрос.
channelData.tenant.id Идентификатор клиента Azure Active Directory.
channelData.channel.id ID канала (если запрос был сделан в канале).
channelData.team.id Team ID (если запрос был сделан в канале).
channelData.source.name Имя источника, из которого вызывается модуль задач.
ChannelData.legacy. replyToId Получает или задает ID сообщения, на которое это сообщение является ответом.
value.commandId Содержит ID вызываемой команды.
value.commandContext Контекст, который вызвал событие. Это должно быть compose .
value.context.theme Клиентская тема пользователя, полезная для встраиваемого форматирования веб-просмотра. Он должен быть default или contrast dark .

Пример

Свойства активности полезной нагрузки при вызове модуля задач из канала (ответ на поток) приводятся в следующем примере:

{
  "type": "invoke",
  "id": "f:19ccc884-c792-35ef-2f40-d0ff43dcca71",
  "from": {
    "id": "29:1aBjVi5MwCFfhPIV03E5uDdfpBFXp_2Yz-sjrvVg12oavg96cqpE_DiMhOpmN9zHeZpYbJcuUEKuSDy2AYWPz1A",
    "name": "Olo Brockhouse",
    "aadObjectId": "b130c271-d2eb-45f9-83ab-9eb3fe3788bc"
  },
  "conversation": {
    "isGroup": true,
    "conversationType": "channel",
    "id": "19:6decf54d86d945e4b3924b63a9161a78@thread.skype;messageid=1611060744833",
    "name": "parsable",
    "tenantId": "0d9b645f-597b-41f0-a2a3-ef103fbd91bb"
  },
  "channelData": {
    "channel": {
      "id": "19:6decf54d86d945e4b3924b63a9161a78@thread.skype"
    },
    "team": {
      "id": "19:acca514e83cb497e960e0b014d405336@thread.skype"
    },
    "tenant": {
      "id": "0d9b645f-597b-41f0-a2a3-ef103fbd91bb"
    },
    "source": {
      "name": "compose"
    }
  },
  "value": {
    "commandId": "TEst",
    "commandContext": "message",
    "requestId": "7f7d22efe5414818becebcec649a7912",
    "messagePayload": {
      "linkToMessage": "https://teams.microsoft.com/l/message/19:6decf54d86d945e4b3924b63a9161a78@thread.skype/1611060744833",
      "id": "1611060744833",
      "replyToId": null,
      "createdDateTime": "2021-01-19T12:52:24.833Z",
      "lastModifiedDateTime": null,
      "deleted": false,
      "summary": null,
      "importance": "normal",
      "locale": "en-us",
      "body": {
        "contentType": "html",
        "content": "<div><div><at id=\"0\">Testing outgoing Webhook-Nikitha</at> - Hi</div>\n</div>"
      },
      "from": {
        "device": null,
        "conversation": null,
        "user": {
          "userIdentityType": "aadUser",
          "id": "b130c271-d2eb-45f9-83ab-9eb3fe3788bc",
          "displayName": "Olo Brockhouse"
        },
        "application": null
      },
      "reactions": [],
      "mentions": [
        {
          "id": 0,
          "mentionText": "Testing outgoing Webhook-Nikitha",
          "mentioned": {
            "device": null,
            "conversation": null,
            "user": null,
            "application": {
              "applicationIdentityType": "webhook",
              "id": "b8c1c68c-e290-4bdd-81c3-266f310751dc",
              "displayName": "Testing outgoing Webhook-Nikitha"
            }
          }
        }
      ],
      "attachments": []
    },
    "context": {
      "theme": "default"
    }
  },
  "name": "composeExtension/fetchTask"
}

Свойства активности полезной нагрузки при вызове модуля задач из командного окна

Свойства активности полезной нагрузки при вызове модуля задач из командного окна перечислены следующим образом:

Имя свойства Назначение
type Тип запроса. Это должно быть invoke .
name Тип команды, выданной службе. Это должно быть composeExtension/fetchTask .
from.id ID пользователя, отправив запрос.
from.name Имя пользователя, отправив запрос.
from.aadObjectId Azure Active Directory объекта пользователя, отправив запрос.
channelData.tenant.id Идентификатор клиента Azure Active Directory.
channelData.source.name Имя источника, из которого вызывается модуль задач.
value.commandId Содержит ID вызываемой команды.
value.commandContext Контекст, который вызвал событие. Это должно быть compose .
value.context.theme Клиентская тема пользователя, полезная для встраиваемого форматирования веб-просмотра. Он должен быть default contrast , или dark .

Пример

Свойства активности полезной нагрузки при вызове модуля задач из командного окна приводятся в следующем примере:

{
  "type": "invoke",
  "id": "f:172560f1-95f9-3189-edb2-b7612cd1a3cd",
    "id": "29:1aBjVi5MwCFfhPIV03E5uDdfpBFXp_2Yz-sjrvVg12oavg96cqpE_DiMhOpmN9zHeZpYbJcuUEKuSDy2AYWPz1A",
    "name": "Olo Brockhouse",
    "aadObjectId": "b130c271-d2eb-45f9-83ab-9eb3fe3788bc"
  },
  "conversation": {
    "isGroup": true,
    "conversationType": "channel",
    "id": "19:6decf54d86d945e4b3924b63a9161a78@thread.skype",
    "name": "parsable",
    "tenantId": "0d9b645f-597b-41f0-a2a3-ef103fbd91bb"
  },
  "channelData": {
    "channel": {
      "id": "19:6decf54d86d945e4b3924b63a9161a78@thread.skype"
    },
    "team": {
      "id": "19:acca514e83cb497e960e0b014d405336@thread.skype"
    },
    "tenant": {
      "id": "0d9b645f-597b-41f0-a2a3-ef103fbd91bb"
    },
    "source": {
      "name": "compose"
    }
  },
  "value": {
    "commandId": "TEst",
    "commandContext": "compose",
    "requestId": "d2ce690cdc2b4920a538e75882610a30",
    "context": {
      "theme": "default"
    }
  },
  "name": "composeExtension/fetchTask"
}

Пример

В следующем разделе кода приводится пример fetchTask запроса:

protected override async Task<MessagingExtensionActionResponse> OnTeamsMessagingExtensionFetchTaskAsync(ITurnContext<IInvokeActivity> turnContext, MessagingExtensionAction action, CancellationToken cancellationToken)
{
  //handle fetch task
}

Начальный запрос на вызов из сообщения

Если бот вызывается из сообщения, объект в первоначальном запросе на вызов должен содержать сведения о сообщении, из которых вызывается расширение value обмена сообщениями. Массивы и массивы необязательны, и они не присутствуют, если в исходном сообщении нет реакций или reactions mentions упоминаний. В следующем разделе приводится пример value объекта:

protected override async Task<MessagingExtensionActionResponse> OnTeamsMessagingExtensionFetchTaskAsync(ITurnContext<IInvokeActivity> turnContext, MessagingExtensionAction action, CancellationToken cancellationToken)
{
  var messageText = action.MessagePayload.Body.Content;
  var fromId = action.MessagePayload.From.User.Id;

  //finish handling the fetchTask
}

Ответ на fetchTask

Откликнитесь на запрос на вызов с помощью объекта, который содержит объект с адаптивной картой или task taskInfo веб-URL-адресом, или простое строковом сообщении.

Имя свойства Назначение
type Может быть либо continue представить форму, либо message простое всплывающее всплывающее.
value Объект taskInfo для формы или для string сообщения.

Схема объекта taskInfo заключается в:

Имя свойства Назначение
title Название модуля задач.
height Он должен быть либо integer (в пикселях), или small medium , , large .
width Он должен быть либо integer (в пикселях), или small medium , , large .
card Адаптивная карта, определяющая форму (при ее использовании).
url URL-адрес, открытый внутри модуля задач в качестве встроенного веб-представления.
fallbackUrl Если клиент не поддерживает функцию модуля задач, этот URL-адрес открывается на вкладке браузера.

Ответ на fetchTask с помощью адаптивной карты

При использовании адаптивной карты необходимо отвечать объектом с task value объектом, содержащим адаптивную карту.

Пример

В следующем разделе кода приводится пример ответа fetchTask с помощью адаптивной карты:

В этом примере используется пакет AdaptiveCards NuGet в дополнение к SDK Bot Framework.

protected override async Task<MessagingExtensionActionResponse> OnTeamsMessagingExtensionFetchTaskAsync(ITurnContext<IInvokeActivity> turnContext, MessagingExtensionAction action, CancellationToken cancellationToken)
{
  string placeholder = "Not invoked from message";

  if (action.MessagePayload != null)
  {
      var messageText = action.MessagePayload.Body.Content;
      var fromId = action.MessagePayload.From.User.Id;
      placeholder = "Invoked from message";
  }

  var response = new MessagingExtensionActionResponse()
  {
    Task = new TaskModuleContinueResponse()
    {
      Value = new TaskModuleTaskInfo()
      {
        Height = "small",
        Width = "small",
        Title = "Example task module",
        Card = new Attachment()
        {
          ContentType = AdaptiveCard.ContentType,
          Content = new AdaptiveCard("1.0")
          {
            Body = new List<AdaptiveElement>()
            {
              new AdaptiveTextInput() { Id = "FormField1", Placeholder = placeholder},
              new AdaptiveTextInput() { Id = "FormField2", Placeholder = "FormField2"},
              new AdaptiveTextInput() { Id = "FormField3", Placeholder = "FormField3"},
            },
            Actions = new List<AdaptiveAction>()
            {
              new AdaptiveSubmitAction()
              {
                Type = AdaptiveSubmitAction.TypeName,
                Title = "Submit",
              },
            },
          },
        },
      },
    },
  };
  return response;
}

Создание модуля задач со встроенным веб-представлением

При использовании встроенного веб-представления необходимо отвечать объектом с объектом, содержащим URL-адрес, в веб-форму, которую необходимо task value загрузить. Домены любого URL-адреса, который необходимо загрузить, должны быть включены в массив validDomains манифеста приложения. Дополнительные сведения о создании встроенного веб-представления см. в документации по модулям задач.

protected override async Task<MessagingExtensionActionResponse> OnTeamsMessagingExtensionFetchTaskAsync(ITurnContext<IInvokeActivity> turnContext, MessagingExtensionAction action, CancellationToken cancellationToken)
{
  string placeholder = "Not invoked from message";

  if (action.MessagePayload != null)
  {
      var messageText = action.MessagePayload.Body.Content;
      var fromId = action.MessagePayload.From.User.Id;
      placeholder = "Invoked from message";
  }

  var response = new MessagingExtensionActionResponse()
  {
    Task = new TaskModuleContinueResponse()
    {
      Value = new TaskModuleTaskInfo()
      {
        Height = "small",
        Width = "small",
        Title = "Example task module",
        Url = "https://contoso.com/msteams/taskmodules/newcustomer",
        },
      },
    },
  };
  return response;
}

Запрос на установку разговорного бота

Если приложение содержит разговорный бот, установите бот в беседе и загрузив модуль задач. Бот полезен для получения дополнительного контекста для модуля задач. Примером этого сценария является извлечение списка для заполнения управления сборщиком людей или списка каналов в команде.

Когда расширение обмена сообщениями получает вызов, проверьте, установлен ли бот в текущем контексте для composeExtension/fetchTask облегчения потока. Например, проверьте поток с помощью вызова реестра получения. Если бот не установлен, верни адаптивную карту с действием, которое запрашивает у пользователя установку бота. Пользователь должен иметь разрешение на установку приложений в этом расположении для проверки. Если установка приложения не увенчается успехом, пользователь получает сообщение, чтобы связаться с администратором.

Пример

В следующем разделе кода приводится пример ответа:

{
  "type": "AdaptiveCard",
  "body": [
    {
      "type": "TextBlock",
      "text": "Looks like you haven't used Disco in this team/chat"
    }
  ],
  "actions": [
    {
      "type": "Action.Submit",
      "title": "Continue",
      "data": {
        "msteams": {
          "justInTimeInstall": true
        }
      }
    }
  ],
  "version": "1.0"
}

После установки разговорного бота он получает еще одно сообщение с вызовом name = composeExtension/submitAction и value.data.msteams.justInTimeInstall = true .

Пример

В следующем разделе кода приводится пример ответа задачи на вызов:

{
  "value": {
    "commandId": "giveKudos",
    "commandContext": "compose",
    "context": {
      "theme": "default"
    },
    "data": {
      "msteams": {
        "justInTimeInstall": true
      }
    }
  },
  "conversation": {
    "id": "19:7705841b240044b297123ad7f9c99217@thread.skype"
  },
  "name": "composeExtension/submitAction",
  "imdisplayname": "Bob Smith"
}

Ответ на вызов задачи должен быть похож на ответ установленного бота.

Пример

В следующем разделе кода приводится пример установки приложения с адаптивной картой вовремя:

private static Attachment GetAdaptiveCardAttachmentFromFile(string fileName)
  {
      //Read the card json and create attachment.
         string[] paths = { ".", "Resources", fileName };
         var adaptiveCardJson = File.ReadAllText(Path.Combine(paths));
         var adaptiveCardAttachment = new Attachment()
            {
                ContentType = "application/vnd.microsoft.card.adaptive",
                Content = JsonConvert.DeserializeObject(adaptiveCardJson),
            };
            return adaptiveCardAttachment;
        }

Пример кода

Имя образца Описание .NET Node.js
Teams расширения обмена сообщениями Описывает, как определить команды действий, создать модуль задач и реагировать на отправку действия модуля задач. View View
Teams расширения обмена сообщениями Описывает, как определить команды поиска и реагировать на поиски. View View

Следующий этап

См. также

Определение команд действий