Создание и отправка диалоговых окон

Важно!

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

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

Примечание.

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

Запрос начального вызова

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

Имя свойства Назначение
type Тип запроса. Должно применяться значение invoke.
name Тип команды, выпущенной для вашей службы. Должно применяться значение composeExtension/fetchTask.
from.id Идентификатор пользователя, отправившего запрос.
from.name Имя пользователя, отправившего запрос.
from.aadObjectId Microsoft Entra идентификатор объекта пользователя, отправив запрос.
channelData.tenant.id Microsoft Entra идентификатор клиента.
channelData.channel.id Идентификатор канала (если запрос был выполнен в канале).
channelData.team.id Идентификатор команды (если запрос был выполнен в канале).
value.commandId Содержит идентификатор вызванной команды.
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 Идентификатор пользователя, отправившего запрос.
from.name Имя пользователя, отправившего запрос.
from.aadObjectId Microsoft Entra идентификатор объекта пользователя, отправив запрос.
channelData.tenant.id Microsoft Entra идентификатор клиента.
channelData.source.name Имя источника, из которого вызывается диалоговое окно.
ChannelData.legacy. replyToId Возвращает или устанавливает идентификатор сообщения, ответом на которое является данное сообщение.
value.commandId Содержит идентификатор вызванной команды.
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 Идентификатор пользователя, отправившего запрос.
from.name Имя пользователя, отправившего запрос.
from.aadObjectId Microsoft Entra идентификатор объекта пользователя, отправив запрос.
channelData.tenant.id Microsoft Entra идентификатор клиента.
channelData.source.name Имя источника, из которого вызывается диалоговое окно.
ChannelData.legacy. replyToId Возвращает или устанавливает идентификатор сообщения, ответом на которое является данное сообщение.
value.commandId Содержит идентификатор вызванной команды.
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 Идентификатор пользователя, отправившего запрос.
from.name Имя пользователя, отправившего запрос.
from.aadObjectId Microsoft Entra идентификатор объекта пользователя, отправив запрос.
channelData.tenant.id Microsoft Entra идентификатор клиента.
channelData.channel.id Идентификатор канала (если запрос был выполнен в канале).
channelData.team.id Идентификатор команды (если запрос был выполнен в канале).
channelData.source.name Имя источника, из которого вызывается диалоговое окно.
ChannelData.legacy. replyToId Возвращает или устанавливает идентификатор сообщения, ответом на которое является данное сообщение.
value.commandId Содержит идентификатор вызванной команды.
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 Идентификатор пользователя, отправившего запрос.
from.name Имя пользователя, отправившего запрос.
from.aadObjectId Microsoft Entra идентификатор объекта пользователя, отправив запрос.
channelData.tenant.id Microsoft Entra идентификатор клиента.
channelData.channel.id Идентификатор канала (если запрос был выполнен в канале).
channelData.team.id Идентификатор команды (если запрос был выполнен в канале).
channelData.source.name Имя источника, из которого вызывается диалоговое окно.
ChannelData.legacy. replyToId Возвращает или устанавливает идентификатор сообщения, ответом на которое является данное сообщение.
value.commandId Содержит идентификатор вызванной команды.
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 Идентификатор пользователя, отправившего запрос.
from.name Имя пользователя, отправившего запрос.
from.aadObjectId Microsoft Entra идентификатор объекта пользователя, отправив запрос.
channelData.tenant.id Microsoft Entra идентификатор клиента.
channelData.source.name Имя источника, из которого вызывается диалоговое окно.
value.commandId Содержит идентификатор вызванной команды.
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 Должно быть целым числом (в пикселях) или иметь значение small, medium, large.
width Должно быть целым числом (в пикселях) или иметь значение small, medium, large.
card Адаптивная карточка, определяющая форму (если она используется).
url URL-адрес, который открывается внутри диалогового окна в виде внедренного веб-представления.
fallbackUrl Если клиент не поддерживает функцию диалогового окна, этот URL-адрес открывается на вкладке браузера.

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

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

Пример

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

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

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 dialog",
        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;
}

Создание диалогового окна с внедренным веб-представлением

При использовании внедренного веб-представления необходимо ответить объектом task с объектом value, содержащим URL-адрес веб-формы, которую требуется загрузить. Домены любого 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 dialog",
        Url = "https://contoso.com/msteams/taskmodules/newcustomer",
        },
      },
    },
  };
  return response;
}

Запрос на установку бота для бесед

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

Когда расширение для сообщений получит вызов composeExtensions/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 = composeExtensions/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"
}

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

Пример

Следующий раздел кода является примером JIT-установки приложения с адаптивной карточкой.

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 Python Манифест
Действие расширения для сообщений Teams В этом примере показано, как определить команды действий, создать диалоговое окно и ответить на действие отправки диалога. Просмотр Просмотр Просмотр Просмотр
Предварительный просмотр действия расширения сообщений В этом примере показано, как использовать предварительную версию действий в расширениях обмена сообщениями с помощью Bot Framework версии 4. Просмотр Просмотр Н/Д Просмотр
Поиск в расширении для сообщений Teams В этом примере показано, как создать расширение сообщений на основе Поиск. Он выполняет поиск пакетов nudget и отображает результаты в расширении обмена сообщениями на основе поиска. Просмотр Просмотр Просмотр Просмотр

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

См. также