Freigeben über


Erstellen und Senden von Dialogen

Wichtig

Die Codebeispiele in diesem Abschnitt basieren auf Version 4.6 und höheren Versionen des Bot Framework SDK. Wenn Sie nach Dokumentation zu früheren Versionen suchen, lesen Sie den Abschnitt Nachrichtenerweiterungen – v3 SDK im Ordner Ressourcen der Dokumentation.

Sie können ein modales Dialogfeld (in TeamsJS v1.x als Aufgabenmodul bezeichnet) mithilfe einer adaptiven Karte oder einer eingebetteten Webansicht erstellen. Um ein Dialogfeld zu erstellen, müssen Sie den Prozess ausführen, der als anfängliche Aufrufanforderung bezeichnet wird. Dieses Dokument behandelt die anfängliche Aufrufanforderung, die Eigenschaften der Nutzlastaktivität, wenn ein Dialogfeld über 1:1-Chat, Gruppenchat, Kanal (neuer Beitrag), Kanal (Antwort an Thread) und Befehlsfeld aufgerufen wird.

Hinweis

Wenn Sie das Dialogfeld nicht mit parametern füllen, die im App-Manifest definiert sind, müssen Sie das Dialogfeld für Benutzer mit einer adaptiven Karte oder einer eingebetteten Webansicht erstellen.

Die anfängliche Aufrufanforderung

Im Rahmen der anfänglichen Aufrufanforderung empfängt Ihr Dienst ein Activity-Objekt vom Typ composeExtensions/fetchTask, und Sie müssen mit einem task-Objekt antworten, das entweder eine adaptive Karte oder eine URL zur eingebetteten Webansicht enthält. Neben den standardmäßigen Bot-Aktivitätseigenschaften enthält die anfängliche Aufrufnutzlast die folgenden Anforderungsmetadaten:

Eigenschaftenname Zweck
type Anforderungstyp. Muss invoke sein.
name Art des Befehls, der für Ihren Dienst ausgegeben wird. Muss composeExtension/fetchTask sein.
from.id ID des Benutzers, der die Anforderung gesendet hat.
from.name Name des Benutzers, der die Anforderung gesendet hat.
from.aadObjectId Microsoft Entra-Objekt-ID des Benutzers, der die Anforderung gesendet hat.
channelData.tenant.id Microsoft Entra-Mandanten-ID.
channelData.channel.id Kanal-ID (wenn die Anforderung in einem Kanal erfolgt ist).
channelData.team.id Team-ID (wenn die Anforderung in einem Kanal erfolgt ist).
value.commandId Enthält die ID des Befehls, der aufgerufen wurde.
value.commandContext Der Kontext, der das Ereignis ausgelöst hat. Muss compose sein.
value.context.theme Das Clientdesign des Benutzers; nützlich für die Formatierung eingebetteter Webansichten. Muss default, contrast oder dark sein.

Beispiel

Der Code für die anfängliche Aufrufanforderung ist im folgenden Beispiel angegeben:

{
  "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"

Nutzlastaktivitätseigenschaften, wenn ein Dialogfeld aus einem 1:1-Chat aufgerufen wird

Die Nutzlastaktivitätseigenschaften, wenn ein Dialog aus einem 1:1-Chat aufgerufen wird, werden wie folgt aufgeführt:

Eigenschaftenname Zweck
type Anforderungstyp. Muss invoke sein.
name Art des Befehls, der für Ihren Dienst ausgegeben wird. Muss composeExtension/fetchTask sein.
from.id ID des Benutzers, der die Anforderung gesendet hat.
from.name Name des Benutzers, der die Anforderung gesendet hat.
from.aadObjectId Microsoft Entra-Objekt-ID des Benutzers, der die Anforderung gesendet hat.
channelData.tenant.id Microsoft Entra-Mandanten-ID.
channelData.source.name Der Quellname, von dem aus das Dialogfeld aufgerufen wird.
ChannelData.legacy. replyToId Ruft die ID der Nachricht ab, auf die diese Nachricht eine Antwort ist, oder legt sie fest.
value.commandId Enthält die ID des Befehls, der aufgerufen wurde.
value.commandContext Der Kontext, der das Ereignis ausgelöst hat. Muss compose sein.
value.context.theme Das Clientdesign des Benutzers; nützlich für die Formatierung eingebetteter Webansichten. Muss default, contrast oder dark sein.

Beispiel

Die Nutzlastaktivitätseigenschaften, wenn ein Dialog aus einem 1:1-Chat aufgerufen wird, werden im folgenden Beispiel angegeben:

{
  "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"
}

Nutzlastaktivitätseigenschaften, wenn ein Dialogfeld aus einem Gruppenchat aufgerufen wird

Die Nutzlastaktivitätseigenschaften, wenn ein Dialogfeld aus einem Gruppenchat aufgerufen wird, werden wie folgt aufgeführt:

Eigenschaftenname Zweck
type Anforderungstyp. Muss invoke sein.
name Art des Befehls, der für Ihren Dienst ausgegeben wird. Muss composeExtension/fetchTask sein.
from.id ID des Benutzers, der die Anforderung gesendet hat.
from.name Name des Benutzers, der die Anforderung gesendet hat.
from.aadObjectId Microsoft Entra-Objekt-ID des Benutzers, der die Anforderung gesendet hat.
channelData.tenant.id Microsoft Entra-Mandanten-ID.
channelData.source.name Der Quellname, von dem aus das Dialogfeld aufgerufen wird.
ChannelData.legacy. replyToId Ruft die ID der Nachricht ab, auf die diese Nachricht eine Antwort ist, oder legt sie fest.
value.commandId Enthält die ID des Befehls, der aufgerufen wurde.
value.commandContext Der Kontext, der das Ereignis ausgelöst hat. Muss compose sein.
value.context.theme Das Clientdesign des Benutzers; nützlich für die Formatierung eingebetteter Webansichten. Muss default, contrast oder dark sein.

Beispiel

Die Nutzlastaktivitätseigenschaften, wenn ein Dialog aus einem Gruppenchat aufgerufen wird, werden im folgenden Beispiel angegeben:

{
  "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"
}

Nutzlastaktivitätseigenschaften, wenn ein Dialogfeld aus einem Besprechungschat aufgerufen wird

Die Nutzlastaktivitätseigenschaften, wenn ein Dialogfeld aus einem Besprechungschat aufgerufen wird, werden im folgenden Beispiel angegeben:

{
   "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",
}

Nutzlastaktivitätseigenschaften, wenn ein Dialogfeld von einem Kanal aufgerufen wird (neuer Beitrag)

Die Nutzlastaktivitätseigenschaften, wenn ein Dialog über einen Kanal (neuer Beitrag) aufgerufen wird, werden wie folgt aufgeführt:

Eigenschaftenname Zweck
type Anforderungstyp. Muss invoke sein.
name Art des Befehls, der für Ihren Dienst ausgegeben wird. Muss composeExtension/fetchTask sein.
from.id ID des Benutzers, der die Anforderung gesendet hat.
from.name Name des Benutzers, der die Anforderung gesendet hat.
from.aadObjectId Microsoft Entra-Objekt-ID des Benutzers, der die Anforderung gesendet hat.
channelData.tenant.id Microsoft Entra-Mandanten-ID.
channelData.channel.id Kanal-ID (wenn die Anforderung in einem Kanal erfolgt ist).
channelData.team.id Team-ID (wenn die Anforderung in einem Kanal erfolgt ist).
channelData.source.name Der Quellname, von dem aus das Dialogfeld aufgerufen wird.
ChannelData.legacy. replyToId Ruft die ID der Nachricht ab, auf die diese Nachricht eine Antwort ist, oder legt sie fest.
value.commandId Enthält die ID des Befehls, der aufgerufen wurde.
value.commandContext Der Kontext, der das Ereignis ausgelöst hat. Muss compose sein.
value.context.theme Das Clientdesign des Benutzers; nützlich für die Formatierung eingebetteter Webansichten. Muss default, contrast oder dark sein.

Beispiel

Die Nutzlastaktivitätseigenschaften, wenn ein Dialog über einen Kanal (neuer Beitrag) aufgerufen wird, werden im folgenden Beispiel angegeben:

{
  "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"
}

Nutzlastaktivitätseigenschaften, wenn ein Dialog von einem Kanal aufgerufen wird (Antwort auf thread)

Die Nutzlastaktivitätseigenschaften, wenn ein Dialog über einen Kanal (Antwort an thread) aufgerufen wird, werden wie folgt aufgeführt:

Eigenschaftenname Zweck
type Anforderungstyp. Muss invoke sein.
name Art des Befehls, der für Ihren Dienst ausgegeben wird. Muss composeExtension/fetchTask sein.
from.id ID des Benutzers, der die Anforderung gesendet hat.
from.name Name des Benutzers, der die Anforderung gesendet hat.
from.aadObjectId Microsoft Entra-Objekt-ID des Benutzers, der die Anforderung gesendet hat.
channelData.tenant.id Microsoft Entra-Mandanten-ID.
channelData.channel.id Kanal-ID (wenn die Anforderung in einem Kanal erfolgt ist).
channelData.team.id Team-ID (wenn die Anforderung in einem Kanal erfolgt ist).
channelData.source.name Der Quellname, von dem aus das Dialogfeld aufgerufen wird.
ChannelData.legacy. replyToId Ruft die ID der Nachricht ab, auf die diese Nachricht eine Antwort ist, oder legt sie fest.
value.commandId Enthält die ID des Befehls, der aufgerufen wurde.
value.commandContext Der Kontext, der das Ereignis ausgelöst hat. Muss compose sein.
value.context.theme Das Clientdesign des Benutzers; nützlich für die Formatierung eingebetteter Webansichten. Muss default, contrast oder dark sein.

Beispiel

Die Nutzlastaktivitätseigenschaften, wenn ein Dialog über einen Kanal (Antwort an thread) aufgerufen wird, werden im folgenden Beispiel angegeben:

{
  "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"
}

Nutzlastaktivitätseigenschaften, wenn ein Dialogfeld über ein Befehlsfeld aufgerufen wird

Die Nutzlastaktivitätseigenschaften, wenn ein Dialogfeld über ein Befehlsfeld aufgerufen wird, werden wie folgt aufgeführt:

Eigenschaftenname Zweck
type Anforderungstyp. Muss invoke sein.
name Art des Befehls, der für Ihren Dienst ausgegeben wird. Muss composeExtension/fetchTask sein.
from.id ID des Benutzers, der die Anforderung gesendet hat.
from.name Name des Benutzers, der die Anforderung gesendet hat.
from.aadObjectId Microsoft Entra-Objekt-ID des Benutzers, der die Anforderung gesendet hat.
channelData.tenant.id Microsoft Entra-Mandanten-ID.
channelData.source.name Der Quellname, von dem aus das Dialogfeld aufgerufen wird.
value.commandId Enthält die ID des Befehls, der aufgerufen wurde.
value.commandContext Der Kontext, der das Ereignis ausgelöst hat. Muss compose sein.
value.context.theme Das Clientdesign des Benutzers; nützlich für die Formatierung eingebetteter Webansichten. Muss default, contrast oder dark sein.

Beispiel

Die Nutzlastaktivitätseigenschaften, wenn ein Dialogfeld über ein Befehlsfeld aufgerufen wird, sind im folgenden Beispiel angegeben:

{
  "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"
}

Beispiel

Der folgende Codeabschnitt ist ein Beispiel für eine fetchTask-Anforderung:

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

Anfängliche Aufrufanforderung aus einer Nachricht

Wenn Ihr Bot von einer Nachricht aus aufgerufen wird, muss das value -Objekt in der anfänglichen Aufrufanforderung die Details der Nachricht enthalten, von der die Nachrichtenerweiterung aufgerufen wird. Die Arrays reactions und mentions sind optional und nicht vorhanden, wenn die ursprüngliche Nachricht keine Reaktionen oder Erwähnungen enthält. Der folgende Abschnitt ist ein Beispiel für das value-Objekt:

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
}

Reagieren auf fetchTask

Antworten Sie auf die Aufrufanforderung mit einem task-Objekt, das ein taskInfo-Objekt mit der adaptiven Karte oder einer Web-URL oder eine einfache Zeichenfolgennachricht enthält.

Eigenschaftenname Zweck
type Kann entweder continue zum Präsentieren eines Formulars oder message für ein einfaches Popupfenster verwendet werden.
value Entweder ein taskInfo-Objekt für ein Formular oder ein string-Objekt für eine Nachricht.

Das Schema für das taskInfo-Objekt ist wie folgt:

Eigenschaftenname Zweck
title Der Titel des Dialogfelds.
height Muss entweder eine ganze Zahl (in Pixel) sein oder small, medium oder large lauten.
width Muss entweder eine ganze Zahl (in Pixel) sein oder small, medium oder large lauten.
card Die adaptive Karte, die das Formular definiert (falls verwendet).
url Die URL, die im Dialogfeld als eingebettete Webansicht geöffnet werden soll.
fallbackUrl Wenn ein Client das Dialogfeldfeature nicht unterstützt, wird diese URL auf einer Browserregisterkarte geöffnet.

Reagieren auf fetchTask mit einer adaptiven Karte

Wenn Sie eine adaptive Karte verwenden, müssen Sie mit einem task -Objekt mit dem Objekt antworten, das value eine adaptive Karte enthält.

Beispiel

Der folgende Codeabschnitt ist ein Beispiel für die fetchTask Antwort mit einer adaptiven Karte:

In diesem Beispiel wird zusätzlich zum Bot Framework SDK das AdaptiveCards NuGet-Paket verwendet.

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;
}

Erstellen eines Dialogfelds mit einer eingebetteten Webansicht

Wenn Sie eine eingebettete Webansicht verwenden, müssen Sie mit einem task-Objekt mit dem value-Objekt antworten, das die URL zu dem Webformular enthält, das geladen werden soll. Die Domänen aller URLs, die geladen werden sollen, müssen im validDomains-Array im Manifest Ihrer App enthalten sein. Weitere Informationen zum Erstellen einer eingebetteten Webansicht finden Sie in der Dialogdokumentation.

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;
}

Anfordern der Installation Ihres Unterhaltungs-Bots

Wenn die App einen Konversationsbot enthält, installieren Sie den Bot in der Unterhaltung, und laden Sie dann den Dialog. Der Bot ist nützlich, um zusätzlichen Kontext für den Dialog zu erhalten. Ein Beispiel für dieses Szenario ist das Abrufen einer Liste zum Befüllen eines Personenauswahl-Steuerelements oder der Liste der Kanäle in einem Team.

Wenn die Nachrichtenerweiterung den composeExtensions/fetchTask-Aufruf empfängt, überprüfen Sie, ob der Bot im aktuellen Kontext installiert ist, um den Fluss zu erleichtern. Überprüfen Sie z. B. den Fluss durch das Abrufen einer Liste. Wenn der Bot nicht installiert ist, geben Sie eine adaptive Karte mit einer Aktion zurück, die den Benutzer auffordert, den Bot zu installieren. Der Benutzer muss über die Berechtigung zum Installieren der Apps an diesem Speicherort für die Überprüfung verfügen. Wenn die App-Installation fehlschlägt, erhält der Benutzer eine Nachricht, in der er aufgefordert wird, sich an den Administrator zu wenden.

Beispiel

Der folgende Codeabschnitt ist ein Beispiel für die Antwort:

{
  "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"
}

Nach der Installation des Unterhaltungs-Bots folgt eine weitere Aufrufnachricht mit name = composeExtensions/submitAction und value.data.msteams.justInTimeInstall = true.

Beispiel

Der folgende Codeabschnitt ist ein Beispiel für die Aufgabenantwort auf den Aufruf:

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

Die Aufgabenantwort auf den Aufruf muss der des installierten Bots ähneln.

Beispiel

Der folgende Codeabschnitt ist ein Beispiel für die Just-in-Time-Installation der App mit adaptiver Karte:

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;
        }

Codebeispiel

Beispielname Beschreibung .NET Node.js Python Manifest
Teams-Nachrichtenerweiterungen – Aktion In diesem Beispiel wird gezeigt, wie Sie Aktionsbefehle definieren, einen Dialog erstellen und auf die Aktion "Dialog übermitteln" reagieren. View View View View
Vorschau der Aktion "Nachrichtenerweiterung" In diesem Beispiel wird gezeigt, wie Sie die Aktionsvorschau in Messagingerweiterungen mit Bot Framework v4 verwenden. View View View
Teams Nachrichtenerweiterungen – Suche In diesem Beispiel wird gezeigt, wie Sie eine suchbasierte Nachrichtenerweiterung erstellen. Es durchsucht Nudget-Pakete und zeigt die Ergebnisse in der suchbasierten Messagingerweiterung an. View View View View

Nächster Schritt

Siehe auch