Hinzufügen und Ausführen von C#-Skripts inline mit Standardworkflows für Azure Logic Apps (Vorschau)
Gilt für: Azure Logic Apps (Standard)
Hinweis
Diese Funktion befindet sich in der Vorschauphase und unterliegt den Zusätzlichen Nutzungsbedingungen für Microsoft Azure-Vorschauversionen.
Um benutzerdefinierte Integrationsaufgaben inline in Ihrem Standardworkflow in Azure Logic Apps auszuführen, können Sie C#-Skripts direkt aus Ihrem Workflow hinzufügen und ausführen. Verwenden Sie für diese Aufgabe die Inline Code Aktion namens Execute CSharp Script Code. Diese Aktion gibt die Ergebnisse Ihres Skripts zurück, sodass Sie die Ausgabe in nachfolgenden Aktionen Ihres Workflows verwenden können.
Diese Funktion bietet die folgenden Vorteile:
Schreiben Sie eigene Skripts im Workflow-Designer, um komplexere Integrationsprobleme zu lösen, ohne Azure Functions verwenden zu müssen. Es sind keine weiteren Dienstpläne erforderlich.
Dieser Vorteil optimiert die Workflowentwicklung und reduziert die Komplexität und Kosten bei der Verwaltung weiterer Dienste.
Generieren Sie eine dedizierte Codedatei, die einen personalisierten Skriptbereich in Ihrem Workflow bereitstellt.
Stellen Sie Skripts zusammen mit Ihren Workflows bereit.
In diesem Handbuch wird gezeigt, wie Sie die Aktion in Ihrem Workflow hinzufügen und den C#-Skriptcode hinzufügen, den Sie ausführen möchten.
Voraussetzungen
Ein Azure-Konto und ein Azure-Abonnement. Falls Sie kein Abonnement besitzen, können Sie sich für ein kostenloses Azure-Konto registrieren.
Der Standardlogik-App-Workflow, in dem Sie Ihr C#-Skript hinzufügen möchten. Der Workflow muss bereits mit einem Trigger gestartet werden. Weitere Informationen finden Sie unter Erstellen eines Standard Logik-App-Beispielworkflows.
Sie können jeden Trigger für Ihr Szenario verwenden, aber als Beispiel verwendet dieses Handbuch den Anforderungsauslöser namens Wenn eine HTTP-Anforderung empfangen wird und auch die Antwortaktion. Der Workflow wird ausgeführt, wenn eine andere Anwendung oder ein anderer Workflow eine Anforderung an die Endpunkt-URL des Triggers sendet. Das Beispielskript gibt die Ergebnisse aus der Codeausführung als Ausgabe zurück, die Sie in nachfolgenden Aktionen verwenden können.
Beispielszenarien
In der folgenden Liste werden einige Beispielszenarien beschrieben, in denen Sie ein Skript bei bestimmten Integrationsaufgaben verwenden können:
Analysieren und Durchführen von Transformationen oder Manipulationen für eine Nutzlast über die integrierten Ausdrücke und Datenvorgänge hinaus. Sie können z. B. ein Skript verwenden, um ein geändertes Schema für die nachgelagerte Verarbeitung zurückzugeben.
Verwalten Sie Azure-Ressourcen, z. B. virtuelle Computer, und starten oder stufen Sie sie basierend auf einer bestimmten Geschäftslogik.
Führen Sie eine gespeicherte Prozedur auf einem SQL-Server aus, die in einem Zeitplan ausgeführt werden muss, und speichern Sie die Ergebnisse in SharePoint.
Protokollieren Sie Workflowfehler mit detaillierten Informationen, indem Sie in Azure Storage speichern oder E-Mails senden oder Ihr Team benachrichtigen.
Verschlüsseln und Entschlüsseln von Daten zur Einhaltung der API-Sicherheitsstandards.
Übergeben Sie eine Datei an das Skript, um eine HTTP-Anforderung zu zippen oder zu entzippen.
Aggregieren von Daten aus verschiedenen APIs und Dateien zum Erstellen von täglichen Berichten
Überlegungen
Das Azure-Portal speichert Ihr Skript als C#-Skriptdatei (CSX) im selben Ordner wie Ihre workflow.json-Datei, die die JSON-Definition für Ihren Workflow speichert, und stellt die Datei zusammen mit der Workflowdefinition in Ihrer Logik-App-Ressource bereit. Azure Logic Apps kompiliert diese Datei, um das Skript für die Ausführung vorzubereiten.
Mit dem CSX-Dateiformat müssen Sie weniger „Textbausteine“ schreiben und können sich auf das Schreiben Ihrer C#-Funktion konzentrieren. Sie können die CSX-Datei umbenennen, um die Verwaltung während der Bereitstellung zu vereinfachen. Jedes Mal, wenn Sie das Skript umbenennen, überschreibt die neue Version jedoch die vorherige Version.
Das Skript ist lokal für den Workflow. Wenn Sie dasselbe Skript in anderen Workflows verwenden möchten, zeigen Sie die Skriptdatei in der KuduPlus-Konsole an, und kopieren Sie dann das Skript, um es in anderen Workflows wiederzuverwenden.
Begrenzungen
Name | Grenze | Hinweise |
---|---|---|
Skriptausführungsdauer | 10 Minuten | Wenn Sie Szenarien haben, die längere Dauer benötigen, verwenden Sie die Produktfeedbackoption, um weitere Informationen zu Ihren Anforderungen bereitzustellen. |
Ausgabegröße | 100 MB | Die Ausgabegröße hängt vom Grenzwert für die Ausgabegröße für Aktionen ab, was im Allgemeinen 100 MB beträgt. |
Hinzufügen der Ausführen-CSharp-Skriptcodeaktion
Öffnen Sie im Azure-Portal Ihre Standard-Logik-App und deren Workflow im Workflow-Designer.
Führen Sie im Designer die folgenden allgemeinen Schritte aus, um Ihrem Workflow die Aktion Inlinecodevorgänge mit dem Namen CSharp Script Code ausführen hinzuzufügen.
Nachdem der Aktionsinformationsbereich geöffnet wurde, aktualisieren Sie auf der Registerkarte Parameter im Feld Codedatei den vorab ausgefüllten Beispielcode mit Ihrem eigenen Skriptcode.
Importieren Sie oben im Skript die erforderlichen Namespaces, und fügen Sie alle erforderlichen Assemblyverweise wie gewohnt hinzu.
Implementieren Sie die
Run
-Methode:Der
Run
Methodenname ist vordefiniert, und Ihr Workflow wird nur ausgeführt, indem diese Run-Methode zur Laufzeit aufgerufen wird.Um auf Daten zuzugreifen, die von Ihrem Workflow stammen, akzeptiert die
Run
Methode diese Daten über einen Parameter mit dem WorkflowContext-Typ. Sie können das WorkflowContext-Objekt für die folgenden Aufgaben verwenden:Um die Ergebnisse des Skripts oder andere Daten an Ihren Workflow zurückzugeben, implementieren Sie die
Run
Methode mit einem Rückgabetyp. Weitere Informationen finden Sie unter Zurückgeben von Daten an Ihren Workflow.Um die Ausgabe ihres Skripts in C# zu protokollieren, implementieren Sie die
Run
Methode, um einen Funktionsprotokollierer über einen Parameter mitILogger
Typ zu akzeptieren, und verwenden Sielog
sie als Argumentnamen zur einfachen Identifizierung. Vermeiden Sie das Einschließen vonConsole.Write
in Ihr Skript.Wichtig
Wenn Sie über ein langes Skript verfügen, das eine ordnungsgemäße Beendigung erfordert, falls der Funktionshost heruntergefahren wird, schließen Sie ein Abbruchtoken ein, das erforderlich ist, mit Ihrem Funktionsprotokollierer.
Weitere Informationen finden Sie in den folgenden Abschnitten:
Das folgende Beispiel zeigt die Registerkarte Parameter der Aktion mit dem Beispielskriptcode:
Das folgende Beispiel zeigt den Beispielskriptcode:
/// Add the required libraries. #r "Newtonsoft.Json" #r "Microsoft.Azure.Workflows.Scripting" using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Primitives; using Microsoft.Extensions.Logging; using Microsoft.Azure.Workflows.Scripting; using Newtonsoft.Json.Linq; /// <summary> /// Executes the inline C# code. /// </summary> /// <param name="context">The workflow context.</param> /// <remarks> The entry-point to your code. The function signature should remain unchanged.</remarks> public static async Task<Results> Run(WorkflowContext context, ILogger log) { var triggerOutputs = (await context.GetTriggerResults().ConfigureAwait(false)).Outputs; /// Dereferences the 'name' property from the trigger payload. var name = triggerOutputs?["body"]?["name"]?.ToString(); /// To get the outputs from a preceding action, you can uncomment and repurpose the following code. // var actionOutputs = (await context.GetActionResults("<action-name>").ConfigureAwait(false)).Outputs; /// The following logs appear in the Application Insights traces table. // log.LogInformation("Outputting results."); // var name = null; return new Results { Message = !string.IsNullOrEmpty(name) ? $"Hello {name} from CSharp action" : "Hello from CSharp action." }; } public class Results { public string Message {get; set;} }
Weitere Informationen finden Sie unter "#r" – Verweisen auf externe Assemblys.
Speichern Sie Ihren Workflow, wenn Sie fertig sind.
Nachdem Sie Ihren Workflow ausgeführt haben, können Sie die Workflowausgabe in Application Insights überprüfen, sofern dieses Tool aktiviert ist. Weitere Informationen finden Sie unter Anzeigen von Protokollen in Application Insights.
Importieren von Namespaces
Gehen Sie zum Importieren von Namespaces wie gewohnt mit der using
Klausel vor. Die folgende Liste enthält automatisch importierte Namespaces, sodass sie optional sind, damit sie in Ihr Skript eingeschlossen werden können:
System
System.Collections.Generic
System.IO
System.Linq
System.Net.Http
System.Threading.Tasks
Microsoft.Azure.WebJobs
Microsoft.Azure.WebJobs.Host
Hinzufügen von Verweisen auf externe Assemblys
Verwenden Sie zum Verweisen auf .NET Framework-Assemblys die #r "<assembly-name>
Direktive, z. B.:
/// Add the required libraries.
#r "Newtonsoft.Json"
#r "Microsoft.Azure.Workflows.Scripting"
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Microsoft.Extensions.Logging;
using Microsoft.Azure.Workflows.Scripting;
using Newtonsoft.Json.Linq;
public static async Task<Results> Run(WorkflowContext context)
{
<...>
}
public class Results
{
<...>
}
Die folgende Liste enthält Assemblys, die automatisch von der Azure Functions-Hostumgebung hinzugefügt wurden:
mscorlib
System
System.Core
System.Xml
System.Net.Http
Microsoft.Azure.WebJobs
Microsoft.Azure.WebJobs.Host
Microsoft.Azure.WebJobs.Extensions
System.Web.Http
System.Net.Http.Formatting
Newtonsoft.Json
Protokollausgabe in einem Datenstrom
Fügen Sie in der Run
Methode einen Parameter mit ILogger
Typ und log
als Namen ein, z. B.:
public static void Run(WorkflowContext context, ILogger log)
{
log.LogInformation($"C# script successfully executed.");
}
Protokollausgabe in Application Insights
Sie können die LogMetric
-Erweiterungsmethode in ILogger
verwenden, um in Application Insights benutzerdefinierte Metriken zu erstellen.
Das folgende Beispiel zeigt einen Beispielmethodenaufruf:
logger.LogMetric("TestMetric", 1234);
Access-Workflowtrigger und Aktionsausgabe in Ihrem Skript
Verwenden Sie die folgenden Methoden, die für das WorkflowContext
Kontextobjekt verfügbar sind, um auf Daten aus Ihrem Workflow zuzugreifen:
GetTriggerResults
-MethodeVerwenden Sie diese Methode, um auf Triggerausgaben zuzugreifen, um ein Objekt zurückzugeben, das den Trigger und die zugehörigen Ausgaben darstellt, die über die
Outputs
Eigenschaft verfügbar sind. Dieses Objekt weist den Typ JObject auf. Sie können als Indexer eckige Klammern ([]) verwenden, um auf verschiedene Eigenschaften in den Triggerausgaben zuzugreifen.Im folgenden Beispiel werden die Daten aus der
body
-Eigenschaft in der Triggerausgabe abgerufen:public static async Task<Results> Run(WorkflowContext context, ILogger log) { var triggerOutputs = (await context.GetTriggerResults().ConfigureAwait(false)).Outputs; var body = triggerOutputs["body"]; return new Results; } public class Results { <...> }
GetActionResults
-MethodeVerwenden Sie diese Methode, um auf Aktionsausgaben zuzugreifen, um ein Objekt zurückzugeben, das die Aktion und die zugehörigen Ausgaben darstellt, die über die
Outputs
Eigenschaft verfügbar sind. Diese Methode akzeptiert einen Aktionsnamen als Parameter. Im folgenden Beispiel werden die Daten aus derbody
-Eigenschaft in den Ausgaben einer Aktion mit dem Namen action-name abgerufen:public static async Task<Results> Run(WorkflowContext context, ILogger log) { var actionOutputs = (await context.GetActionResults("action-name").ConfigureAwait(false)).Outputs; var body = actionOutputs["body"]; return new Results; } public class Results { <...> }
Zugriffsumgebungsvariablen oder App-Einstellungswert
Verwenden Sie die System.Environment.GetEnvironmentVariable
Methode, um eine Umgebungsvariable oder einen App-Einstellungswert abzurufen, z.B.:
public static void Run(WorkflowContext context, ILogger log)
{
log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
log.LogInformation(GetEnvironmentVariable("AzureWebJobsStorage"));
log.LogInformation(GetEnvironmentVariable("WEBSITE_SITE_NAME"));
}
public static string GetEnvironmentVariable(string name)
{
return name + ": " +
System.Environment.GetEnvironmentVariable(name, EnvironmentVariableTarget.Process);
}
Zurückgeben von Daten an Ihren Workflow
Implementieren Sie für diese Aufgabe Ihre Run
-Methode mit einem Rückgabetyp und die return
-Anweisung. Wenn Sie eine asynchrone Version verwenden möchten, implementieren Sie die Run
-Methode mit einem Task<return-type>
-Attribut und dem Schlüsselwort async
. Der Rückgabewert wird auf die body
-Eigenschaft der Ausgabe der Skriptaktion festgelegt, auf die nachfolgende Workflowaktionen verweisen können.
Das folgende Beispiel zeigt eine Run
-Methode mit einem Task<Results>
-Attribut, dem Schlüsselwort async
und einer return
-Anweisung:
public static async Task<Results> Run(WorkflowContext context, ILogger log)
{
return new Results
{
Message = !string.IsNullOrEmpty(name) ? $"Returning results with status message."
};
}
public class Results
{
public string Message {get; set;}
}
Ansehen der Skriptdatei
Öffnen Sie im Azure-Portal Ihre Standardlogik-App-Ressource mit dem gewünschten Workflow.
Wählen Sie im Ressourcenmenü Ihrer Logik-App unter Entwicklungstools die Option Erweiterte Tools aus.
Wählen Sie auf der Seite Erweiterte Tools die Option Goaus, wodurch die KuduPlus Konsole geöffnet wird.
Öffnen Sie das Menü Debugkonsole, und wählen Sie CMD aus.
Wechseln Sie zum Stammspeicherort Ihrer Logik-App: website/wwwroot
Wechseln Sie zum Ordner Ihres Workflows, der die CSX-Datei enthält, entlang dieses Pfads: site/wwwroot/{workflow-name}
Wählen Sie neben dem Dateinamen Bearbeiten aus, um die Datei zu öffnen und anzuzeigen.
Anzeigen von Protokollen in Application Insights
Wählen Sie im Azure-Portal im Ressourcenmenü der Logik-App unter Einstellungen die Option Application Insights und dann Ihre Logik-App aus.
Wählen Sie im Menü Application Insights unter Überwachung die Option Protokolle aus.
Erstellen Sie eine Abfrage, um Ablaufverfolgungen oder Fehler der Workflowausführung zu finden, z. B.:
union traces, errors | project TIMESTAMP, message
Kompilierungsfehler
In dieser Version enthält der webbasierte Editor eingeschränkte IntelliSense-Unterstützung, die noch verbessert wird. Alle Kompilierungsfehler werden erkannt, wenn Sie Ihren Workflow speichern, und die Azure Logic Apps-Laufzeit kompiliert Ihr Skript. Diese Fehler werden in den Fehlerprotokollen Ihrer Logic-App angezeigt.
Laufzeitfehler
Wenn ein Fehler auftritt, wenn Ihr Skript ausgeführt wird, führen Azure Logic Apps die folgenden Schritte aus:
- Gibt den Fehler an Ihren Workflow zurück.
- Markiert die Skriptaktion als fehlgeschlagen.
- Stellt ein Fehlerobjekt bereit, das die Ausnahme darstellt, die von Ihrem Skript ausgelöst wird.
Das folgende Beispiel zeigt einen Beispielfehler:
Die Funktion "CSharp_MyLogicApp-InvalidAction_execute_csharp_script_code.csx" ist mit dem Fehler "Die Aktion "Nicht vorhanden" ist im Workflow nicht vorhanden.“ fehlgeschlagen. Überprüfen Sie, ob der Funktionscode gültig ist.
Beispielskripts
Die folgenden Beispielskripts führen verschiedene Aufgaben aus, die Sie möglicherweise ausführen können
Dekomprimieren einer ZIP-Datei mit Textdateien aus einer HTTP-Aktion in ein Zeichenfolgenarray
// Add the required libraries.
#r "Newtonsoft.Json"
#r "Microsoft.Azure.Workflows.Scripting"
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Microsoft.Azure.Workflows.Scripting;
using System;
using System.IO;
using System.IO.Compression;
using System.Text;
using System.Collections.Generic;
/// <summary>
/// Executes the inline C# code.
/// </summary>
/// <param name="context">The workflow context.</param>
public static async Task<List<string>> Run(WorkflowContext context)
{
var outputs = (await context.GetActionResults("HTTP_1").ConfigureAwait(false)).Outputs;
var base64zipFileContent = outputs["body"]["$content"].ToString();
// Decode base64 to bytes.
byte[] zipBytes = Convert.FromBase64String(base64zipFileContent);
List<string> fileContents = new List<string>();
// Creates an in-memory stream from the zip bytes.
using (MemoryStream zipStream = new MemoryStream(zipBytes))
{
// Extracts files from the zip archive.
using (ZipArchive zipArchive = new ZipArchive(zipStream))
{
foreach (ZipArchiveEntry entry in zipArchive.Entries)
{
// Read each file's content.
using (StreamReader reader = new StreamReader(entry.Open()))
{
string fileContent = reader.ReadToEnd();
fileContents.Add(fileContent);
}
}
}
}
return fileContents;
}
Verschlüsseln von Daten mithilfe eines Schlüssels aus App-Einstellungen
// Add the required libraries.
#r "Newtonsoft.Json"
#r "Microsoft.Azure.Workflows.Scripting"
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Microsoft.Azure.Workflows.Scripting;
using Newtonsoft.Json.Linq;
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
/// <summary>
/// Executes the inline csharp code.
/// </summary>
/// <param name="context">The workflow context.</param>
public static async Task<string> Run(WorkflowContext context)
{
var compose = (await context.GetActionResults("compose").ConfigureAwait(false)).Outputs;
var text = compose["sampleData"].ToString();
return EncryptString(text);
}
public static string EncryptString(string plainText)
{
var key = Environment.GetEnvironmentVariable("app-setting-key");
var iv = Environment.GetEnvironmentVariable("app-setting-iv");
using (Aes aesAlg = Aes.Create())
{
aesAlg.Key = Encoding.UTF8.GetBytes(key);
aesAlg.IV = Encoding.UTF8.GetBytes(iv);
ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
using (MemoryStream msEncrypt = new MemoryStream())
{
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
{
swEncrypt.Write(plainText);
}
}
return Convert.ToBase64String(msEncrypt.ToArray());
}
}
}
WorkflowContext-Klasse
Stellt einen Workflowkontext dar.
Methoden
GetActionResult(string actionName)
Ruft das Ergebnis aus einer bestimmten Aktion im Workflow ab.
Die asynchrone Version verwendet "Task"<> als Rückgabetyp, z. B.:
Task<WorkflowOperationResult> GetActionResult(string actionName)
Parameter
actionName
: Der Aktionsname.
Gibt zurück
Die asynchrone Version gibt ein Task
Objekt zurück, das den asynchronen Vorgang darstellt. Das Aufgabenergebnis enthält ein WorkflowOperationResult
Objekt. Informationen zu den WorkflowOperationResult-Objekteigenschaften finden Sie unter workflowOperationResult-Klasse.
RunTriggerResult()
Ruft das Ergebnis vom Trigger im Workflow ab.
Die asynchrone Version verwendet "Task"<> als Rückgabetyp, z. B.:
Task<WorkflowOperationResult> RunTriggerResult()
Parameter
Keine.
Gibt zurück
Die asynchrone Version gibt ein Task
Objekt zurück, das den asynchronen Vorgang darstellt. Das Aufgabenergebnis enthält ein WorkflowOperationResult
Objekt. Informationen zu den WorkflowOperationResult-Objekteigenschaften finden Sie unter workflowOperationResult-Klasse.
WorkflowOperationResult-Klasse
Stellt das Ergebnis eines Workflowvorgangs dar.
Eigenschaften
Name des Dataflows | Typ | BESCHREIBUNG |
---|---|---|
Name | String | Dient zum Abrufen oder Festlegen des Vorgangsnamens. |
Eingaben | JToken | Ruft die Ausführungseingaben für den Vorgang ab oder legt sie fest. |
Ausgaben | JToken | Ruft die Ausführungsausgabe des Vorgangs ab oder legt sie fest. |
StartTime | DateTime? | Ruft die Startzeit des Vorgangs ab oder legt sie fest. |
EndTime | DateTime? | Ruft die Endzeit des Vorgangs ab oder legt sie fest. |
OperationTrackingId | String | Ruft die Vorgangsverfolgungs-ID ab oder legt sie fest. |
Code | String | Dient zum Abrufen oder Festlegen des Statuscodes für die Aktion. |
Status | String | Dient zum Abrufen oder Festlegen des Status für die Aktion. |
Fehler | JToken | Ruft den Fehler für die Aktion ab oder legt den Fehler fest. |
TrackedProperties | JToken | Dient zum Abrufen oder Festlegen der nachverfolgten Eigenschaften für die Aktion. |