Freigeben über


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

  1. Öffnen Sie im Azure-Portal Ihre Standard-Logik-App und deren Workflow im Workflow-Designer.

  2. 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.

  3. Nachdem der Aktionsinformationsbereich geöffnet wurde, aktualisieren Sie auf der Registerkarte Parameter im Feld Codedatei den vorab ausgefüllten Beispielcode mit Ihrem eigenen Skriptcode.

    Das folgende Beispiel zeigt die Registerkarte Parameter der Aktion mit dem Beispielskriptcode:

    Screenshot: Azure-Portal, Standardworkflow-Designer, Anforderungstrigger, Ausführen der CSharp-Skriptcode-Aktion mit geöffnetem Informationsbereich und Antwortaktion. Der Informationsbereich zeigt ein C#-Beispielskript.

    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.

  4. 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-Methode

    Verwenden 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-Methode

    Verwenden 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 der body-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

  1. Öffnen Sie im Azure-Portal Ihre Standardlogik-App-Ressource mit dem gewünschten Workflow.

  2. Wählen Sie im Ressourcenmenü Ihrer Logik-App unter Entwicklungstools die Option Erweiterte Tools aus.

  3. Wählen Sie auf der Seite Erweiterte Tools die Option Goaus, wodurch die KuduPlus Konsole geöffnet wird.

  4. Öffnen Sie das Menü Debugkonsole, und wählen Sie CMD aus.

  5. Wechseln Sie zum Stammspeicherort Ihrer Logik-App: website/wwwroot

  6. Wechseln Sie zum Ordner Ihres Workflows, der die CSX-Datei enthält, entlang dieses Pfads: site/wwwroot/{workflow-name}

  7. Wählen Sie neben dem Dateinamen Bearbeiten aus, um die Datei zu öffnen und anzuzeigen.

Anzeigen von Protokollen in Application Insights

  1. Wählen Sie im Azure-Portal im Ressourcenmenü der Logik-App unter Einstellungen die Option Application Insights und dann Ihre Logik-App aus.

  2. Wählen Sie im Menü Application Insights unter Überwachung die Option Protokolle aus.

  3. 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.

Hinzufügen und Ausführen von JavaScript-Codeausschnitten