Dela via


Lägga till och köra C#-skript infogade med Standard-arbetsflöden för Azure Logic Apps (förhandsversion)

Gäller för: Azure Logic Apps (Standard)

Kommentar

Den här funktionen är i förhandsversion och omfattas av kompletterande användningsvillkor för Förhandsversioner av Microsoft Azure.

Om du vill utföra anpassade integreringsuppgifter i linje med standardarbetsflödet i Azure Logic Apps kan du lägga till och köra C#-skript direkt inifrån arbetsflödet. För den här uppgiften använder du åtgärden Infogad kod med namnet Kör CSharp-skriptkod. Den här åtgärden returnerar resultatet från skriptet så att du kan använda dessa utdata i arbetsflödets efterföljande åtgärder.

Den här funktionen ger följande fördelar:

  • Skriv egna skript i arbetsflödesdesignern så att du kan lösa mer komplexa integreringsutmaningar utan att behöva använda Azure Functions. Inga andra tjänstplaner krävs.

    Den här förmånen effektiviserar arbetsflödesutvecklingen och minskar komplexiteten och kostnaden med att hantera fler tjänster.

  • Generera en dedikerad kodfil som tillhandahåller ett anpassat skriptutrymme i arbetsflödet.

  • Distribuera skript tillsammans med dina arbetsflöden.

Den här guiden visar hur du lägger till åtgärden i arbetsflödet och lägger till C#-skriptkoden som du vill köra.

Förutsättningar

  • Ett Azure-konto och prenumeration. Om du inte har någon prenumeration kan du registrera ett kostnadsfritt Azure-konto.

  • Arbetsflödet för standardlogikappen där du vill lägga till C#-skriptet. Arbetsflödet måste redan börja med en utlösare. Mer information finns i Skapa exempel på standardarbetsflöden för logikappar.

    Du kan använda valfri utlösare för ditt scenario, men som exempel använder den här guiden utlösaren Begäran med namnet När en HTTP-begäran tas emot och även åtgärden Svar . Arbetsflödet körs när ett annat program eller arbetsflöde skickar en begäran till utlösarens slutpunkts-URL. Exempelskriptet returnerar resultatet från kodkörningen som utdata som du kan använda i efterföljande åtgärder.

Exempelscenarier

I följande lista beskrivs några exempelscenarier där du kan använda ett skript som hjälper till med vissa integreringsuppgifter:

  • Parsa och utföra transformeringar eller manipuleringar på en nyttolast utöver de inbyggda uttrycken och funktionerna för dataåtgärder. Du kan till exempel använda ett skript för att returnera ett ändrat schema för nedströmsbearbetning.

  • Hantera Azure-resurser som virtuella datorer och starta eller stega dem baserat på affärslogik.

  • Kör en lagrad procedur på en SQL-server som måste köras enligt ett schema och lagra resultaten på SharePoint.

  • Logga arbetsflödesfel med detaljerad information genom att spara till Azure Storage eller skicka e-post till eller meddela ditt team.

  • Kryptera och dekryptera data för att följa API:s säkerhetsstandarder.

  • Skicka en fil till skriptet för att zippa eller packa upp för en HTTP-begäran.

  • Aggregera data från olika API:er och filer för att skapa dagliga rapporter

Att tänka på

  • Azure-portalen sparar skriptet som en C#-skriptfil (.csx) i samma mapp som din workflow.json-fil , som lagrar JSON-definitionen för arbetsflödet, och distribuerar filen till logikappresursen tillsammans med arbetsflödesdefinitionen. Azure Logic Apps kompilerar den här filen för att göra skriptet redo för körning.

    Med .csx-filformatet kan du skriva mindre "boilerplate" och fokusera bara på att skriva en C#-funktion. Du kan byta namn på .csx-filen för enklare hantering under distributionen. Men varje gång du byter namn på skriptet skriver den nya versionen över den tidigare versionen.

  • Skriptet är lokalt för arbetsflödet. Om du vill använda samma skript i andra arbetsflöden kan du visa skriptfilen i KuduPlus-konsolen och sedan kopiera skriptet för återanvändning i andra arbetsflöden.

Begränsningar

Name Begränsning Kommentar
Varaktighet för skriptkörning 10 minuter Om du har scenarier som behöver längre varaktigheter använder du alternativet för produktfeedback för att ge mer information om dina behov.
Utdatastorlek 100 MB Utdatastorleken beror på utdatastorleksgränsen för åtgärder, som vanligtvis är 100 MB.

Lägg till åtgärden Execute CSharp Script Code (Kör CSharp-skriptkod)

  1. Öppna din standardlogikappresurs och ditt arbetsflöde i designern i Azure-portalen.

  2. I designern följer du de här allmänna stegen för att lägga till åtgärden Infogade kodåtgärder med namnet Execute CSharp Script Code (Kör CSharp-skriptkod ) i arbetsflödet.

  3. När åtgärdsinformationsfönstret har öppnats går du till fliken Parametrar och i rutan Kodfil uppdaterar du den förifyllda exempelkoden med din egen skriptkod.

    I följande exempel visas fliken Parametrar för åtgärden med exempelskriptkoden:

    Skärmbild som visar Azure Portal, Standard workflow designer, Request trigger, Execute CSharp Script Code action with information pane open och Response action .Screenshot shows Azure portal, Standard workflow designer, Request trigger, Execute CSharp Script Code action with information pane open, and Response action. Informationsfönstret visar C#-exempelskriptet.

    I följande exempel visas exempelskriptkoden:

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

    Mer information finns i "#r" – Referera till externa sammansättningar.

  4. Spara arbetsflödet när du är klar.

När du har kört arbetsflödet kan du granska arbetsflödets utdata i Application Insights om det är aktiverat. Mer information finns i Visa loggar i Application Insights.

Importera namnområden

Om du vill importera namnområden gör du det med using satsen som vanligt. Följande lista innehåller automatiskt importerade namnområden, så de är valfria för dig att inkludera i skriptet:

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

Lägga till referenser till externa sammansättningar

Om du vill referera till .NET Framework-sammansättningar använder du #r "<assembly-name> direktivet, till exempel:

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

Följande lista innehåller sammansättningar som automatiskt läggs till av Azure Functions-värdmiljön:

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

Logga utdata till en dataström

I din Run metod inkluderar du en parameter med ILogger typ och log som namn, till exempel:

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

Logga utdata till Application Insights

Om du vill skapa anpassade mått i Application Insights använder du LogMetric tilläggsmetoden på ILogger.

I följande exempel visas ett exempelmetodanrop:

logger.LogMetric("TestMetric", 1234);

Komma åt arbetsflödesutlösare och åtgärdsutdata i skriptet

Om du vill komma åt data från arbetsflödet använder du följande metoder som är tillgängliga för kontextobjektet WorkflowContext :

  • GetTriggerResults metod

    För att komma åt utlösarutdata använder du den här metoden för att returnera ett objekt som representerar utlösaren och dess utdata, som är tillgängliga via Outputs egenskapen. Det här objektet har JObject-typ och du kan använda hakparenteserna ([]) som indexerare för att få åtkomst till olika egenskaper i utlösarutdata.

    I följande exempel hämtas data från body egenskapen i utlösarens utdata:

    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 metod

    Om du vill komma åt åtgärdsutdata använder du den här metoden för att returnera ett objekt som representerar åtgärden och dess utdata, som är tillgängliga via Outputs egenskapen. Den här metoden accepterar ett åtgärdsnamn som en parameter. I följande exempel hämtas data från body egenskapen i utdata från en åtgärd med namnet 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
    {
        <...>
    }
    

Åtkomst till miljövariabler eller appinställningsvärde

Om du vill hämta en miljövariabel eller ett appinställningsvärde använder du System.Environment.GetEnvironmentVariable metoden, till exempel:

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

Returnera data till arbetsflödet

För den här uppgiften implementerar du din Run metod med en returtyp och return -instruktion. Om du vill ha en asynkron version implementerar Run du metoden med ett Task<return-type> attribut och nyckelordet async . Returvärdet är inställt på skriptåtgärdens utdataegenskap body , som eventuella efterföljande arbetsflödesåtgärder sedan kan referera till.

I följande exempel visas en Run metod med ett Task<Results> attribut, nyckelordet async och en return -instruktion:

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

Visa skriptfilen

  1. I Azure-portalen öppnar du din standardlogikappresurs som har det arbetsflöde du vill ha.

  2. På resursmenyn för logikappen går du till Utvecklingsverktyg och väljer Avancerade verktyg.

  3. På sidan Avancerade verktyg väljer du Go, som öppnar KuduPlus-konsolen .

  4. Öppna menyn Felsökningskonsol och välj CMD.

  5. Gå till logikappens rotplats: site/wwwroot

  6. Gå till arbetsflödets mapp, som innehåller .csx-filen, längs den här sökvägen: site/wwwroot/{workflow-name}

  7. Bredvid filnamnet väljer du Redigera för att öppna och visa filen.

Visa loggar i Application Insights

  1. I Azure-portalen går du till resursmenyn för logikappen under Inställningar, väljer Application Insights och sedan din logikapp.

  2. På Menyn Application Insights går du till Övervakning och väljer Loggar.

  3. Skapa en fråga för att hitta eventuella spårningar eller fel från arbetsflödeskörningen, till exempel:

    union traces, errors
    | project TIMESTAMP, message
    

Kompileringsfel

I den här versionen innehåller den webbaserade redigeraren begränsat IntelliSense-stöd, som fortfarande är under förbättring. Eventuella kompileringsfel identifieras när du sparar arbetsflödet och Azure Logic Apps-körningen kompilerar skriptet. Dessa fel visas i logikappens felloggar.

Körningsfel

Om ett fel inträffar när skriptet körs utför Azure Logic Apps följande steg:

  • Skickar tillbaka felet till arbetsflödet.
  • Markerar skriptåtgärden som Misslyckad.
  • Innehåller ett felobjekt som representerar undantaget som genereras från skriptet.

I följande exempel visas ett exempelfel:

Funktionen "CSharp_MyLogicApp-InvalidAction_execute_csharp_script_code.csx" misslyckades med felet "Åtgärden "obefintlig" finns inte i arbetsflödet. vid körning. Kontrollera att funktionskoden är giltig.

Exempelskript

Följande exempelskript utför olika uppgifter som du kan utföra

Expandera en ZIP-fil med textfiler från en HTTP-åtgärd till en strängmatris

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

Kryptera data med hjälp av en nyckel från appinställningar

// 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());

        }
    }
}

Klassen WorkflowContext

Representerar en arbetsflödeskontext.

Metoder

GetActionResult(string actionName)

Hämtar resultatet från en specifik åtgärd i arbetsflödet.

Den asynkrona versionen använder Aktivitet<> som returtyp, till exempel:

Task<WorkflowOperationResult> GetActionResult(string actionName)

Parametrar

actionName: Åtgärdsnamnet.

Returer

Den asynkrona versionen returnerar ett Task objekt som representerar den asynkrona åtgärden. Aktivitetsresultatet innehåller ett WorkflowOperationResult objekt. Information om objektegenskaperna för WorkflowOperationResult finns i klassen WorkflowOperationResult.

RunTriggerResult()

Hämtar resultatet från utlösaren i arbetsflödet.

Den asynkrona versionen använder Aktivitet<> som returtyp, till exempel:

Task<WorkflowOperationResult> RunTriggerResult()

Parametrar

Inget.

Returer

Den asynkrona versionen returnerar ett Task objekt som representerar den asynkrona åtgärden. Aktivitetsresultatet innehåller ett WorkflowOperationResult objekt. Information om objektegenskaperna för WorkflowOperationResult finns i klassen WorkflowOperationResult.

Klassen WorkflowOperationResult

Representerar resultatet från en arbetsflödesåtgärd.

Egenskaper

Namn Type Beskrivning
Namn String Hämtar eller anger åtgärdsnamnet.
Ingångar JToken Hämtar eller anger indata för åtgärdskörning.
Utdata JToken Hämtar eller anger utdata för åtgärdskörningen.
StartTime DateTime? Hämtar eller anger åtgärdens starttid.
EndTime DateTime? Hämtar eller anger åtgärdens sluttid.
OperationTrackingId String Hämtar eller anger åtgärdsspårnings-ID.
Code String Hämtar eller anger statuskoden för åtgärden.
Status String Hämtar eller anger status för åtgärden.
Fel JToken Hämtar eller anger felet för åtgärden.
TrackedProperties JToken Hämtar eller anger de spårade egenskaperna för åtgärden.

Lägga till och köra JavaScript-kodfragment