Einführung
Mit benutzerdefinierten Konnektoren können Sie einen Konnektor für Dienste implementieren, die in den vordefinierten Konnektoren für Microsoft Power Platform nicht verfügbar sind. Entwickler können benutzerdefinierten Code verwenden, um eine erweiterte Transformation der Eingabe und Ausgabe der Aktionen eines Konnektors zu implementieren.
Eine grundlegende benutzerdefinierte Konnektordefinition legt die Trigger und Aktionen fest, die für die Hersteller verfügbar sind, die den Konnektor nutzen. Wenn ein Ersteller die Aktion aus einer App oder einem Flow verwendet, wird der Vorgang der API aufgerufen und übergibt die in der benutzerdefinierten Konnektordefinition festgelegte Nutzlast. Es wird erwartet, dass die Antwortnutzlast des Dienstes mit der Antwortdefinition der benutzerdefinierten Konnektoraktion übereinstimmt. Für die Nutzlast für Anforderungen und Antworten findet keine Transformation statt.
Richtlinienvorlagen
Definitionen von Konnektoraktionen können eine grundlegende Transformation der Anforderung und Antwort an den Dienst ohne Code implementieren, indem benutzerdefinierte Konnektor-Richtlinienvorlagen angewendet werden. Richtlinienvorlagen können zum Beispiel die folgenden Arten von Transformationen durchführen:
Anforderungs‑ oder Antwortdaten von einem Objekt in ein Array konvertieren
Anforderungs‑ oder Antwortdaten von einem Array in ein Objekt konvertieren
Die Host-URL für die Anfrage festlegen
Anfrage-HTTP-Kopfzeilenwerte einrichten
Einen Eigenschaftswert in der Anfrage oder Antwort festlegen
Anforderungsabfrage-Zeichenfolgeparameter einrichten
Zur Umwandlung der Anfrage und Antwort können Sie mehrere Richtlinienvorlagen zusammen verwenden. Beim Einrichten mehrerer Vorlagen bearbeiten Sie auch die Reihenfolge, um die Reihenfolge der Richtlinienanwendung zu steuern.
Entwickler können durch das Implementieren von benutzerdefiniertem Code über die Möglichkeiten von Richtlinienvorlagen hinausgehen. Wenn Sie benutzerdefinierten Code implementieren, übernimmt die Logik die vollständige Kontrolle über die Anforderungs‑ und Antworttransformation, einschließlich der Aufgabe, den Vorgang für den zugrunde liegenden Dienst aufzurufen.
Benutzerdefinierten Code implementieren
Sie müssen eine Klasse mit dem Namen Skript erstellen, die von der abstrakten Basisklasse ScriptBase erben muss, um benutzerdefinierten Code zu implementieren. Die Klasse ScriptBase definiert eine abstrakte Methode, ExecuteAsync, die Sie in der Klasse Skript implementieren müssen, um benutzerdefinierten Code erfolgreich in einem Konnektor zu implementieren. Von der Methode ExecuteAsync wird erwartet, dass sie die vollständige Implementierung aller Transformationen und Aufrufe des zugrunde liegenden Dienstes umfasst.
Im folgenden Beispiel sehen Sie eine Klasse, die die erforderlichen Elemente implementiert:
public class Script : ScriptBase
{
public override Task<HttpResponseMessage> ExecuteAsync()
{
// Your code here
}
}
Die Methode ExecuteAsync muss die vollständige Implementierung aller Transformationen und Aufrufe des zugrunde liegenden Dienstes bereitstellen. Im folgenden Beispiel wird der zugrunde liegende Dienst nicht aufgerufen, und jede Antwort wäre ein Objekt, das eine greeting-Eigenschaft enthält, die auf „Hello World!“ festgelegt ist.
public override async Task<HttpResponseMessage> ExecuteAsync()
{
// Create a new response
var response = new HttpResponseMessage();
// Set the content
// Initialize a new JObject and call .ToString() to get the serialized JSON
response.Content = CreateJsonContent(new JObject
{
["greeting"] = "Hello World!",
}.ToString());
return response;
}
Mit der Methode SendAsync für das Kontextobjekt rufen Sie den zugrunde liegenden Dienst auf. Die folgende Methode ExecAsync führt keine Transformationen durch, sondern leitet die Anfrage an den zugrunde liegenden Dienst weiter und gibt die Antwort dann unverändert zurück.
public override async Task<HttpResponseMessage> ExecuteAsync()
{
HttpResponseMessage response = await this.Context.SendAsync(this.Context.Request, this.CancellationToken).ConfigureAwait(continueOnCapturedContext: false);
return response;
}
Die häufigste Verwendung von benutzerdefiniertem Code besteht darin, die Anforderung vor dem Aufruf der Methode SendAsync umzuwandeln. Alternativ können Sie die Antwort der Methode SendAsync vor der Rückkehr von der Methode ExecuteAsync umwandeln.
Benutzerdefinierten Code für Vorgänge erstellen
Sie können benutzerdefinierten Code für einen Konnektor aktivieren und dann eine gültige .cs‑ oder .csx-Datei hochladen, die den Code enthält. Sie können nur eine Skriptklasse für den Konnektor bereitstellen und diese muss Aktionen verarbeiten, die für den Konnektor eingerichtet sind. Überprüfen Sie dazu die OperationId aus dem Objekt Context, um zu bestimmen, ob Sie den Code transformieren oder zum zugrunde liegenden Service weiterleiten möchten. Das folgende Beispiel zeigt diesen Schritt in Aktion.
if (this.Context.OperationId != "CreateProduct")
{
return await this.HandleForwardOperation().ConfigureAwait(false);
}
In diesem Beispiel wird jede andere Aktion als CreateProduct ohne Transformation weitergeleitet. Durch diese Ansatz wird sichergestellt, dass unerwartete Aktionen, die eingerichtet werden, um Code auszuführen, weitergeleitet und nicht transformiert werden.
Sie können auch festlegen, für welche Vorgänge der benutzerdefinierte Code ausgeführt wird, indem Sie ihn so einstellen, dass er für bestimmte Vorgänge ausgeführt wird. Nach der Aktivierung des Codes führen alle Vorgänge standardmäßig den benutzerdefinierten Code aus. Im folgenden Bild wird gezeigt, dass nur AddInvoice und GetInvoice den benutzerdefinierten Code ausführen.
Wenn Sie in einem exportierten Konnektor nach diesen Werten suchen, finden Sie diese in der Datei apiProperties.json.
"scriptOperations": [
"AddInvoice”,
"GetInvoice”
],
Stellen Sie sicher, dass Ihre Auswahl an Vorgängen, die den benutzerdefinierten Code ausführen, entsprechend der Erwartungen der bedingten Prüfungen in Ihrem Code ist. Wenn sie nicht synchron sind, kommt es oft vor, dass der benutzerdefinierte Code nicht ausgeführt wird oder unerwartete Fehler auftreten. Wenn bei Ihrem Konnektor Fehler aufgetreten sind, überprüfen Sie, ob die Konnektordefinition und der Skriptcode die Verarbeitung derselben Vorgänge erwarten.
Im Rest des Moduls lernen Sie mehr darüber, wie Sie benutzerdefinierte Codetransformationen erstellen, die Sie mit Ihren benutzerdefinierten Konnektoren implementieren können.