Delen via


C#-scripts inline toevoegen en uitvoeren met Standard-werkstromen voor Azure Logic Apps (preview)

Van toepassing op: Azure Logic Apps (Standard)

Notitie

Deze mogelijkheid is in preview en is onderworpen aan de aanvullende gebruiksvoorwaarden voor Microsoft Azure Previews.

Als u aangepaste integratietaken inline wilt uitvoeren met uw Standaardwerkstroom in Azure Logic Apps, kunt u C#-scripts rechtstreeks vanuit uw werkstroom toevoegen en uitvoeren. Gebruik voor deze taak de actie Inline Code uitvoeren met de naam CSharp-scriptcode uitvoeren. Deze actie retourneert de resultaten van uw script, zodat u deze uitvoer kunt gebruiken in de volgende acties van uw werkstroom.

Deze mogelijkheid biedt de volgende voordelen:

  • Schrijf uw eigen scripts in de werkstroomontwerper, zodat u complexere integratieproblemen kunt oplossen zonder Azure Functions te hoeven gebruiken. Er zijn geen andere serviceplannen nodig.

    Dit voordeel stroomlijnt de ontwikkeling van werkstromen en vermindert de complexiteit en kosten met het beheren van meer services.

  • Genereer een toegewezen codebestand, dat een gepersonaliseerde scriptruimte in uw werkstroom biedt.

  • Implementeer scripts naast uw werkstromen.

In deze handleiding ziet u hoe u de actie toevoegt aan uw werkstroom en hoe u de C#-scriptcode toevoegt die u wilt uitvoeren.

Vereisten

  • Een Azure-account en -abonnement. Als u nog geen abonnement hebt, meld u dan aan voor een gratis Azure-account.

  • De werkstroom voor de logische standaard-app waar u uw C#-script wilt toevoegen. De werkstroom moet al beginnen met een trigger. Zie Voorbeeldwerkstromen voor logische apps maken voor meer informatie.

    U kunt elke trigger voor uw scenario gebruiken, maar in deze handleiding wordt de aanvraagtrigger met de naam Wanneer een HTTP-aanvraag wordt ontvangen en ook de actie Antwoord gebruikt. De werkstroom wordt uitgevoerd wanneer een andere toepassing of werkstroom een aanvraag naar de eindpunt-URL van de trigger verzendt. Het voorbeeldscript retourneert de resultaten van code-uitvoering als uitvoer die u in volgende acties kunt gebruiken.

Voorbeeldscenario's

In de volgende lijst worden enkele voorbeeldscenario's beschreven waarin u een script kunt gebruiken voor bepaalde integratietaken:

  • Parseer en voer transformaties of manipulaties uit op een nettolading buiten de ingebouwde expressies en mogelijkheden voor gegevensbewerkingen. U kunt bijvoorbeeld een script gebruiken om een gewijzigd schema te retourneren voor downstreamverwerking.

  • Beheer Azure-resources, zoals virtuele machines, en start of stap deze, op basis van bepaalde bedrijfslogica.

  • Voer een opgeslagen procedure uit op een SQL-server die volgens een planning moet worden uitgevoerd en sla de resultaten op in SharePoint.

  • Logboekwerkstroomfouten met gedetailleerde informatie door op te slaan in Azure Storage of uw team te e-mailen of op de hoogte te stellen.

  • Gegevens versleutelen en ontsleutelen om te voldoen aan API-beveiligingsstandaarden.

  • Geef een bestand door aan het script om een HTTP-aanvraag te zippen of uit te pakken.

  • Gegevens uit verschillende API's en bestanden aggregeren om dagelijkse rapporten te maken

Overwegingen

  • Azure Portal slaat uw script op als een C#-scriptbestand (.csx) in dezelfde map als uw workflow.json-bestand , waarin de JSON-definitie voor uw werkstroom wordt opgeslagen en het bestand samen met de werkstroomdefinitie wordt geïmplementeerd in de resource van uw logische app. Azure Logic Apps compileert dit bestand om het script gereed te maken voor uitvoering.

    Met de .csx-bestandsindeling kunt u minder 'standaard' schrijven en zich richten op het schrijven van een C#-functie. U kunt de naam van het .csx-bestand wijzigen voor eenvoudiger beheer tijdens de implementatie. Telkens wanneer u de naam van het script wijzigt, wordt de vorige versie echter overschreven door de nieuwe versie.

  • Het script is lokaal voor de werkstroom. Als u hetzelfde script in andere werkstromen wilt gebruiken, bekijkt u het scriptbestand in de KuduPlus-console en kopieert u het script om het opnieuw te gebruiken in andere werkstromen.

Beperkingen

Naam Limiet Opmerkingen
Duur van scriptuitvoering 10 minuten Als u scenario's hebt die langere duur nodig hebben, gebruikt u de optie voor productfeedback om meer informatie over uw behoeften te geven.
Uitvoergrootte 100 MB De uitvoergrootte is afhankelijk van de uitvoergroottelimiet voor acties, die over het algemeen 100 MB zijn.

De actie CSharp-scriptcode uitvoeren toevoegen

  1. Open in Azure Portal de resource en werkstroom van uw standaard logische app in de ontwerpfunctie.

  2. Volg deze algemene stappen in de ontwerpfunctie om de actie Inline-codebewerkingen met de naam CSharp-scriptcode uitvoeren toe te voegen aan uw werkstroom.

  3. Nadat het deelvenster actiegegevens is geopend, werkt u op het tabblad Parameters in het vak Codebestand de vooraf ingevulde voorbeeldcode bij met uw eigen scriptcode.

    • Importeer bovenaan het script de benodigde naamruimten en voeg eventuele vereiste assemblyverwijzingen zoals gebruikelijk toe.

    • Implementeer de Run methode:

      • De naam van de Run methode is vooraf gedefinieerd en uw werkstroom wordt alleen uitgevoerd door deze run-methode tijdens runtime aan te roepen.

      • Voor toegang tot gegevens die afkomstig zijn van uw werkstroom, accepteert de Run methode deze gegevens via een parameter met het type WorkflowContext . U kunt het WorkflowContext-object gebruiken voor de volgende taken:

      • Als u de resultaten of andere gegevens van het script wilt retourneren aan uw werkstroom, implementeert u de Run methode met een retourtype. Zie Gegevens retourneren naar uw werkstroom voor meer informatie.

      • Als u de uitvoer van uw script in C# wilt vastleggen, implementeert u de Run methode voor het accepteren van een functielogger via een parameter met ILogger type en gebruikt log u deze als argumentnaam voor eenvoudige identificatie. Vermijd het opnemen Console.Write in uw script.

        Belangrijk

        Als u een langlopend script hebt waarvoor een respijtende beëindiging is vereist voor het geval de functiehost wordt afgesloten, neemt u een annuleringstoken op dat is vereist met uw functielogger.

        Zie de volgende secties voor meer informatie:

    In het volgende voorbeeld ziet u het tabblad Parameters van de actie met de voorbeeldscriptcode:

    Schermopname van Azure Portal, Standaardwerkstroomontwerper, Aanvraagtrigger, Actie CSharp-scriptcode uitvoeren met het informatievenster geopend en de actie Antwoord. In het informatievenster ziet u het voorbeeldscript C#.

    In het volgende voorbeeld ziet u de voorbeeldscriptcode:

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

    Zie '#r' voor meer informatie: verwijzen naar externe assembly's.

  4. Sla uw werkstroom op wanneer u klaar bent.

Nadat u uw werkstroom hebt uitgevoerd, kunt u de uitvoer van de werkstroom controleren in Application Insights, indien ingeschakeld. Zie Logboeken weergeven in Application Insights voor meer informatie.

Naamruimten importeren

Als u naamruimten wilt importeren, moet u dit doen met de using component zoals gebruikelijk. De volgende lijst bevat automatisch geïmporteerde naamruimten, zodat u deze optioneel kunt opnemen in uw script:

System
System.Collections.Generic
System.IO
System.Linq
System.Net.Http
System.Threading.Tasks
Microsoft.Azure.WebJobs
Microsoft.Azure.WebJobs.Host

Verwijzingen toevoegen aan externe assembly's

Als u wilt verwijzen naar .NET Framework-assembly's, gebruikt u de #r "<assembly-name> instructie, bijvoorbeeld:

/// 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
{
    <...>
}

De volgende lijst bevat assembly's die automatisch worden toegevoegd door de Azure Functions-hostingomgeving:

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

Logboekuitvoer naar een stream

Neem in uw Run methode een parameter op met ILogger het type en log als de naam, bijvoorbeeld:

public static void Run(WorkflowContext context, ILogger log)
{
    log.LogInformation($"C# script successfully executed.");
}

Logboekuitvoer naar Application Insights

Als u aangepaste metrische gegevens wilt maken in Application Insights, gebruikt u de LogMetric extensiemethode op ILogger.

In het volgende voorbeeld ziet u een voorbeeldmethode-aanroep:

logger.LogMetric("TestMetric", 1234);

Uitvoer van werkstroomtriggers en -acties in uw script openen

Als u toegang wilt krijgen tot gegevens uit uw werkstroom, gebruikt u de volgende methoden die beschikbaar zijn voor het WorkflowContext contextobject:

  • GetTriggerResults methode

    Gebruik deze methode om toegang te krijgen tot triggeruitvoer om een object te retourneren dat de trigger en de uitvoer vertegenwoordigt, die beschikbaar zijn via de Outputs eigenschap. Dit object heeft het JObject-type en u kunt de vierkante haken ([]) als indexeerfunctie gebruiken voor toegang tot verschillende eigenschappen in de triggeruitvoer.

    In het volgende voorbeeld worden de gegevens opgehaald uit de body eigenschap in de triggeruitvoer:

    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

    Als u actie-uitvoer wilt openen, gebruikt u deze methode om een object te retourneren dat de actie en de uitvoer vertegenwoordigt, die beschikbaar zijn via de Outputs eigenschap. Deze methode accepteert een actienaam als parameter. In het volgende voorbeeld worden de gegevens opgehaald uit de body eigenschap in de uitvoer van een actie met de naam action-name:

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

Toegang tot omgevingsvariabelen of app-instellingswaarde

Als u een omgevingsvariabele of app-instellingswaarde wilt ophalen, gebruikt u de System.Environment.GetEnvironmentVariable methode, bijvoorbeeld:

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

Gegevens retourneren aan uw werkstroom

Implementeer voor deze taak uw Run methode met een retourtype en return instructie. Als u een asynchrone versie wilt, implementeert u de Run methode met een Task<return-type> kenmerk en het async trefwoord. De retourwaarde wordt ingesteld op de uitvoereigenschap body van de scriptactie, waarnaar eventuele volgende werkstroomacties vervolgens kunnen verwijzen.

In het volgende voorbeeld ziet u een Run methode met een Task<Results> kenmerk, het async trefwoord en een return instructie:

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

Het scriptbestand weergeven

  1. Open in Azure Portal de resource voor de logische standaard-app met de gewenste werkstroom.

  2. Selecteer Geavanceerde hulpprogramma's in het resourcemenu van de logische app onder Ontwikkelhulpprogramma's.

  3. Selecteer Go op de pagina Geavanceerde hulpprogramma's, waarmee de KuduPlus-console wordt geopend.

  4. Open het consolemenu Foutopsporing en selecteer CMD.

  5. Ga naar de hoofdlocatie van uw logische app: site/wwwroot

  6. Ga naar de map van uw werkstroom, die het CSX-bestand bevat, langs dit pad: site/wwwroot/{workflow-name}

  7. Selecteer Naast de bestandsnaam Bewerken om het bestand te openen en weer te geven.

Logboeken weergeven in Application Insights

  1. Selecteer in Azure Portal, in het resourcemenu van de logische app, onder Instellingen, Application Insights en selecteer vervolgens uw logische app.

  2. Selecteer Logboeken in het menu Application Insights onder Bewaking.

  3. Maak een query om traceringen of fouten te vinden die afkomstig zijn van de uitvoering van uw werkstroom, bijvoorbeeld:

    union traces, errors
    | project TIMESTAMP, message
    

Compilatiefouten

In deze release bevat de webeditor beperkte IntelliSense-ondersteuning, die nog steeds wordt verbeterd. Eventuele compilatiefouten worden gedetecteerd wanneer u uw werkstroom opslaat en de Azure Logic Apps-runtime compileert uw script. Deze fouten worden weergegeven in de foutenlogboeken van uw logische app.

Runtimefouten

Als er een fout optreedt wanneer uw script wordt uitgevoerd, voert Azure Logic Apps de volgende stappen uit:

  • Geeft de fout weer door aan uw werkstroom.
  • Markeert de scriptactie als Mislukt.
  • Biedt een foutobject dat de uitzondering vertegenwoordigt die is gegenereerd vanuit uw script.

In het volgende voorbeeld ziet u een voorbeeldfout:

De functie 'CSharp_MyLogicApp-InvalidAction_execute_csharp_script_code.csx' is mislukt met de fout 'De actie 'niet-bestaand' bestaat niet in de werkstroom.' bij het uitvoeren. Controleer of de functiecode geldig is.

Voorbeeldscripts

In de volgende voorbeeldscripts worden verschillende taken uitgevoerd die u kunt uitvoeren

Een ZIP-bestand decomprimeren met tekstbestanden van een HTTP-actie in een tekenreeksmatrix

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

Gegevens versleutelen met behulp van een sleutel uit app-instellingen

// 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

Vertegenwoordigt een werkstroomcontext.

Methoden

GetActionResult(tekenreeks actionName)

Hiermee haalt u het resultaat op van een specifieke actie in de werkstroom.

De asynchrone versie gebruikt Taak<> als het retourtype, bijvoorbeeld:

Task<WorkflowOperationResult> GetActionResult(string actionName)

Parameters

actionName: De naam van de actie.

Retouren

De asynchrone versie retourneert een Task object dat de asynchrone bewerking vertegenwoordigt. Het taakresultaat bevat een WorkflowOperationResult object. Zie de klasse WorkflowOperationResult voor informatie over de objecteigenschappen workflowOperationResult.

RunTriggerResult()

Hiermee haalt u het resultaat op van de trigger in de werkstroom.

De asynchrone versie gebruikt Taak<> als het retourtype, bijvoorbeeld:

Task<WorkflowOperationResult> RunTriggerResult()

Parameters

Geen.

Retouren

De asynchrone versie retourneert een Task object dat de asynchrone bewerking vertegenwoordigt. Het taakresultaat bevat een WorkflowOperationResult object. Zie de klasse WorkflowOperationResult voor informatie over de objecteigenschappen workflowOperationResult.

WorkflowOperationResult-klasse

Vertegenwoordigt het resultaat van een werkstroombewerking.

Eigenschappen

Name Type Description
Naam String Hiermee haalt u de naam van de bewerking op of stelt u deze in.
Ingangen JToken Hiermee haalt u de uitvoerinvoer van de bewerking op of stelt u deze in.
Uitvoer JToken Hiermee haalt u de uitvoer van de bewerking op of stelt u deze in.
StartTime Datum/tijd? Hiermee haalt u de begintijd van de bewerking op of stelt u deze in.
EndTime Datum/tijd? Hiermee haalt u de eindtijd van de bewerking op of stelt u deze in.
OperationTrackingId String Hiermee haalt u de tracerings-id van de bewerking op of stelt u deze in.
Code String Hiermee haalt u de statuscode voor de actie op of stelt u deze in.
-Status String Hiermee haalt u de status voor de actie op of stelt u deze in.
Fout JToken Hiermee haalt u de fout voor de actie op of stelt u deze in.
TrackedProperties JToken Hiermee haalt u de bijgehouden eigenschappen voor de actie op of stelt u deze in.

JavaScript-codefragmenten toevoegen en uitvoeren