Přidání a spuštění skriptů jazyka C# s využitím standardních pracovních postupů pro Azure Logic Apps (Preview)

Platí pro: Azure Logic Apps (Standard)

Poznámka:

Tato funkce je ve verzi Preview a podléhá dodatečným podmínkám použití pro microsoft Azure Preview.

Pokud chcete provádět vlastní úlohy integrace s pracovním postupem Standard v Azure Logic Apps, můžete přímo přidávat a spouštět skripty jazyka C# z pracovního postupu. Pro tuto úlohu použijte akci Vložený kód s názvem Execute CSharp Script Code. Tato akce vrátí výsledky ze skriptu, abyste mohli tento výstup použít v následných akcích pracovního postupu.

Tato funkce poskytuje následující výhody:

  • Napište vlastní skripty v návrháři pracovního postupu, abyste mohli řešit složitější problémy s integrací bez nutnosti používat Azure Functions. Nejsou potřeba žádné jiné plány služeb.

    Tato výhoda zjednodušuje vývoj pracovních postupů a snižuje složitost a náklady při správě dalších služeb.

  • Vygenerujte vyhrazený soubor kódu, který poskytuje přizpůsobený skriptovací prostor v rámci pracovního postupu.

  • Nasaďte skripty společně s pracovními postupy.

Tento průvodce ukazuje, jak přidat akci do pracovního postupu a přidat kód skriptu jazyka C#, který chcete spustit.

Požadavky

  • Účet a předplatné Azure. Pokud předplatné nemáte, zaregistrujte si bezplatný účet Azure.

  • Pracovní postup standardní aplikace logiky, do kterého chcete přidat skript jazyka C#. Pracovní postup už musí začínat triggerem. Další informace najdete v tématu Vytvoření ukázkových pracovních postupů standardní aplikace logiky.

    Pro svůj scénář můžete použít libovolnou aktivační událost, ale jako příklad tato příručka používá trigger požadavku s názvem Při přijetí požadavku HTTP a také akci Odpověď. Pracovní postup se spustí, když jiná aplikace nebo pracovní postup odešle požadavek na adresu URL koncového bodu triggeru. Ukázkový skript vrátí výsledky spuštění kódu jako výstup, který můžete použít v následných akcích.

Ukázkové scénáře

Následující seznam popisuje některé ukázkové scénáře, ve kterých můžete skript použít s určitými úlohami integrace:

  • Parsování a provádění transformací nebo manipulace s datovou částí nad rámec integrovaných výrazů a možností operací s daty Můžete například použít skript k vrácení upraveného schématu pro podřízené zpracování.

  • Správa prostředků Azure, jako jsou virtuální počítače, a jejich spuštění nebo krokování na základě určité obchodní logiky

  • Spusťte uloženou proceduru na SQL Serveru, který musí běžet podle plánu, a uložte výsledky na SharePointu.

  • Protokolujte chyby pracovního postupu s podrobnými informacemi uložením do Služby Azure Storage nebo e-mailem nebo upozorněte tým.

  • Zašifrujte a dešifrujte data tak, aby vyhovovala standardům zabezpečení rozhraní API.

  • Předání souboru do skriptu do souboru ZIP nebo rozbalení požadavku HTTP.

  • Agregace dat z různých rozhraní API a souborů za účelem vytváření denních sestav

Důležité informace

  • Azure Portal uloží váš skript jako soubor skriptu jazyka C# (.csx) do stejné složky jako soubor workflow.json , který uloží definici JSON pro váš pracovní postup a nasadí ho do prostředku aplikace logiky spolu s definicí pracovního postupu. Azure Logic Apps tento soubor zkompiluje, aby byl skript připravený ke spuštění.

    Formát souboru .csx umožňuje psát méně "často používané" a soustředit se jen na psaní funkce jazyka C#. Soubor .csx můžete přejmenovat pro snadnější správu během nasazování. Při každém přejmenování skriptu však nová verze přepíše předchozí verzi.

  • Skript je místní pro pracovní postup. Pokud chcete použít stejný skript v jiných pracovních postupech, zobrazte soubor skriptu v konzole KuduPlus a zkopírujte skript, který chcete použít v jiných pracovních postupech.

Omezení

Název Omezení Notes
Doba trvání spuštění skriptu 10 minut Pokud máte scénáře, které potřebují delší dobu trvání, použijte možnost zpětné vazby k produktu a poskytněte další informace o vašich potřebách.
Velikost výstupu 100 MB Velikost výstupu závisí na limitu velikosti výstupu pro akce, což je obecně 100 MB.

Přidání akce Spustit kód skriptu CSharp

  1. Na webu Azure Portal otevřete prostředek aplikace logiky Standard a pracovní postup v návrháři.

  2. V návrháři přidejte do pracovního postupu akci Operace vloženého kódu s názvem Execute CSharp Script Code.

  3. Jakmile se otevře podokno s informacemi o akci, aktualizujte na kartě Parametry v poli Soubor kódu předem připravený ukázkový kód vlastním kódem skriptu.

    Následující příklad ukazuje kartu Parametry akce s kódem ukázkového skriptu:

    Snímek obrazovky s webem Azure Portal, návrhářem standardního pracovního postupu, triggerem požadavku, akcí spustit kód skriptu CSharp s otevřeným podoknem informací a akcí Odpovědi Informační podokno ukazuje ukázkový skript jazyka C#.

    Následující příklad ukazuje vzorový kód skriptu:

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

    Další informace naleznete v tématu "#r" – odkazování na externí sestavení.

  4. Po dokončení uložte pracovní postup.

Po spuštění pracovního postupu můžete zkontrolovat výstup pracovního postupu v Application Insights, pokud je povolený. Další informace najdete v tématu Zobrazení protokolů v Application Insights.

Import oborů názvů

Pokud chcete importovat obory názvů, proveďte to s klauzulí using jako obvykle. Následující seznam obsahuje automaticky importované obory názvů, takže jsou volitelné, abyste je mohli zahrnout do skriptu:

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

Přidání odkazů na externí sestavení

Pokud chcete odkazovat na sestavení rozhraní .NET Framework, použijte direktivu #r "<assembly-name> , například:

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

Následující seznam obsahuje sestavení automaticky přidaná hostitelským prostředím Azure Functions:

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

Výstup protokolu do datového proudu

Do metody zahrňte Run parametr s typem ILogger a log jako název, například:

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

Výstup protokolu do Application Insights

Pokud chcete vytvořit vlastní metriky v Application Insights, použijte metodu LogMetric rozšíření na .ILogger

Následující příklad ukazuje volání ukázkové metody:

logger.LogMetric("TestMetric", 1234);

Přístup k triggerům pracovního postupu a výstupům akcí ve skriptu

Pokud chcete získat přístup k datům z pracovního postupu, použijte následující metody dostupné pro WorkflowContext objekt kontextu:

  • GetTriggerResults metoda

    Chcete-li získat přístup k výstupům triggeru, použijte tuto metodu k vrácení objektu, který představuje trigger a jeho výstupy, které jsou k dispozici prostřednictvím Outputs vlastnosti. Tento objekt má typ JObject a můžete použít hranaté závorky ([]) jako indexer pro přístup k různým vlastnostem ve výstupech triggeru.

    Následující příklad získá data z body vlastnosti ve výstupech triggeru:

    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 metoda

    Chcete-li získat přístup k výstupům akce, použijte tuto metodu k vrácení objektu, který představuje akci a její výstupy, které jsou k dispozici prostřednictvím Outputs vlastnosti. Tato metoda přijímá název akce jako parametr. Následující příklad získá data z body vlastnosti ve výstupech z akce s názvem 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
    {
        <...>
    }
    

Přístup k proměnným prostředí nebo hodnotě nastavení aplikace

Pokud chcete získat proměnnou prostředí nebo hodnotu nastavení aplikace, použijte metodu System.Environment.GetEnvironmentVariable , například:

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

Vrácení dat do pracovního postupu

Pro tuto úlohu implementujte metodu Run s návratovým typem a return příkazem. Pokud chcete asynchronní verzi, implementujte metodu Run s atributem Task<return-type> a klíčovým slovem async . Návratová hodnota je nastavena na výstupní body vlastnost akce skriptu, na kterou pak mohou odkazovat všechny následné akce pracovního postupu.

Následující příklad ukazuje metodu Run s atributem Task<Results> , async klíčovým slovem a příkazem return :

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

Zobrazení souboru skriptu

  1. Na webu Azure Portal otevřete prostředek aplikace logiky Standard, který má požadovaný pracovní postup.

  2. V nabídce prostředků aplikace logiky v části Vývojové nástroje vyberte Rozšířené nástroje.

  3. Na stránce Rozšířené nástroje vyberte Přejít, čímž otevřete konzolu KuduPlus.

  4. Otevřete nabídku konzoly Ladění a vyberte CMD.

  5. Přejděte do kořenového umístění aplikace logiky: web/wwwroot

  6. Přejděte do složky pracovního postupu, která obsahuje soubor .csx, podél této cesty: site/wwwroot/{workflow-name}

  7. Vedle názvu souboru vyberte Upravit , abyste soubor otevřeli a zobrazili.

Zobrazení protokolů v Application Insights

  1. Na webu Azure Portal v nabídce prostředků aplikace logiky v části Nastavení vyberte Application Insights a pak vyberte aplikaci logiky.

  2. V nabídce Application Insights v části Monitorování vyberte Protokoly.

  3. Vytvořte dotaz pro vyhledání trasování nebo chyb při provádění pracovního postupu, například:

    union traces, errors
    | project TIMESTAMP, message
    

Chyby kompilace

V této verzi webový editor zahrnuje omezenou podporu Technologie IntelliSense, která se stále vylepšuje. Všechny chyby kompilace se zjistí při uložení pracovního postupu a modul runtime Azure Logic Apps zkompiluje váš skript. Tyto chyby se zobrazí v protokolech chyb vaší aplikace logiky.

Chyby za běhu

Pokud při spuštění skriptu dojde k chybě, Azure Logic Apps provede tyto kroky:

  • Předá chybu zpět do pracovního postupu.
  • Označí akci skriptu jako neúspěšnou.
  • Poskytuje objekt chyby, který představuje výjimku vyvolanou z vašeho skriptu.

Následující příklad ukazuje ukázkovou chybu:

Funkce CSharp_MyLogicApp-InvalidAction_execute_csharp_script_code.csx selhala s chybou Akce neexistující v pracovním postupu. při provádění. Ověřte platnost kódu funkce.

Ukázkové skripty

Následující ukázkové skripty provádějí různé úlohy, které můžete provést.

Dekomprese souboru ZIP textovými soubory z akce HTTP do pole řetězců

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

Šifrování dat pomocí klíče z nastavení aplikace

// 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 – třída

Představuje kontext pracovního postupu.

Metody

GetActionResult(string actionName)

Získá výsledek z konkrétní akce v pracovním postupu.

Asynchronní verze jako návratový typ používá úlohu<> , například:

Task<WorkflowOperationResult> GetActionResult(string actionName)

Parametry

actionName: Název akce.

Návraty

Asynchronní verze vrátí Task objekt, který představuje asynchronní operaci. Výsledek úkolu obsahuje WorkflowOperationResult objekt. Informace o WorkflowOperationResult vlastnosti objektu, viz WorkflowOperationResult třída.

RunTriggerResult()

Získá výsledek z triggeru v pracovním postupu.

Asynchronní verze jako návratový typ používá úlohu<> , například:

Task<WorkflowOperationResult> RunTriggerResult()

Parametry

Žádná

Návraty

Asynchronní verze vrátí Task objekt, který představuje asynchronní operaci. Výsledek úkolu obsahuje WorkflowOperationResult objekt. Informace o WorkflowOperationResult vlastnosti objektu, viz WorkflowOperationResult třída.

WorkflowOperationResult – třída

Představuje výsledek operace pracovního postupu.

Vlastnosti

Name Typ Popis
Jméno String Získá nebo nastaví název operace.
Vstupy JToken Získá nebo nastaví vstupy provádění operace.
Výstupy JToken Získá nebo nastaví výstupy provádění operace.
Počáteční čas DateTime? Získá nebo nastaví čas spuštění operace.
Koncový čas DateTime? Získá nebo nastaví čas ukončení operace.
OperationTrackingId String Získá nebo nastaví ID sledování operace.
Kód String Získá nebo nastaví stavový kód akce.
Stav Řetězcové Získá nebo nastaví stav akce.
Chyba JToken Získá nebo nastaví chybu akce.
TrackedProperties JToken Získá nebo nastaví sledované vlastnosti akce.

Přidání a spuštění fragmentů kódu JavaScriptu