Megosztás a következőn keresztül:


C#-szkriptek hozzáadása és futtatása az Azure Logic Apps standard munkafolyamataival (előzetes verzió)

A következőkre vonatkozik: Azure Logic Apps (Standard)

Feljegyzés

Ez a funkció előzetes verzióban érhető el, és a Microsoft Azure előzetes verziójának kiegészítő használati feltételei vonatkoznak.

Ha egyéni integrációs feladatokat szeretne végrehajtani a standard munkafolyamattal az Azure Logic Appsben, közvetlenül hozzáadhat és futtathat C#-szkripteket a munkafolyamaton belül. Ehhez a feladathoz használja az Execute CSharp Script Code (CSharp-szkriptkód végrehajtása) nevű beágyazott kódműveletet. Ez a művelet visszaadja a szkript eredményeit, így ezt a kimenetet használhatja a munkafolyamat későbbi műveleteiben.

Ez a funkció a következő előnyöket nyújtja:

  • Saját szkripteket írhat a munkafolyamat-tervezőben, hogy az Azure Functions használata nélkül is megoldhassa az összetettebb integrációs kihívásokat. Nincs szükség más szolgáltatási csomagokra.

    Ez az előny leegyszerűsíti a munkafolyamat-fejlesztést, és több szolgáltatás kezelésével csökkenti a bonyolultságot és a költségeket.

  • Hozzon létre egy dedikált kódfájlt, amely személyre szabott szkriptelési helyet biztosít a munkafolyamaton belül.

  • Szkriptek üzembe helyezése a munkafolyamatok mellett.

Ez az útmutató bemutatja, hogyan adhatja hozzá a műveletet a munkafolyamathoz, és hogyan adhatja hozzá a futtatni kívánt C#-szkriptkódot.

Előfeltételek

  • Azure-fiók és -előfizetés. Ha még nincs előfizetése, regisztráljon egy ingyenes Azure-fiókra.

  • A Standard logikai alkalmazás munkafolyamata, amelyhez hozzá szeretné adni a C# szkriptet. A munkafolyamatnak már egy eseményindítóval kell kezdődnie. További információ: Példa standard logikai alkalmazás munkafolyamatainak létrehozása.

    A forgatókönyvhöz bármilyen eseményindítót használhat, de ez az útmutató például a HTTP-kérések érkezésekor elnevezett Kérelem eseményindítót és a Válasz műveletet használja. A munkafolyamat akkor fut, amikor egy másik alkalmazás vagy munkafolyamat kérést küld az eseményindító végpontJÁNAK URL-címére. A mintaszkript a kódvégrehajtás eredményeit adja vissza kimenetként, amelyet a későbbi műveletekben használhat.

Példaforgatókönyvek

Az alábbi lista néhány példaforgatókönyvet ismertet, amelyekben a szkriptek bizonyos integrációs feladatokban segítenek:

  • A beépített kifejezéseken és adatműveleti képességeken túl elemezheti és végezhet átalakításokat vagy manipulációkat egy hasznos adaton. Egy szkripttel például visszaadhat egy módosított sémát az alsóbb rétegbeli feldolgozáshoz.

  • Az Azure-erőforrások, például a virtuális gépek kezelése és indítása vagy lépése valamilyen üzleti logika alapján.

  • Futtasson egy tárolt eljárást egy SQL Serveren, amelyet ütemezés szerint kell futtatnia, és az eredményeket a SharePointban kell tárolnia.

  • Munkafolyamat-hibák naplózása részletes információkkal az Azure Storage-ba való mentéssel, vagy e-mailben vagy a csapat értesítésével.

  • Az API biztonsági szabványainak megfelelő adatok titkosítása és visszafejtése.

  • Adjon át egy fájlt a szkriptbe, hogy egy HTTP-kérést tömörítsen vagy bontsa ki.

  • Különböző API-kból és fájlokból származó adatok összesítése napi jelentések létrehozásához

Megfontolások

  • Az Azure Portal a szkriptet C# szkriptfájlként (.csx) menti a workflow.json fájllal megegyező mappába, amely tárolja a munkafolyamat JSON-definícióját, és üzembe helyezi a fájlt a logikai alkalmazás erőforrásában a munkafolyamat-definícióval együtt. Az Azure Logic Apps lefordítja ezt a fájlt, hogy a szkript végrehajtásra kész legyen.

    A .csx fájlformátum lehetővé teszi, hogy kevesebb "kazánlemezt" írjon, és csak egy C# függvény írására összpontosítson. Átnevezheti a .csx fájlt a könnyebb felügyelet érdekében az üzembe helyezés során. Azonban minden alkalommal, amikor átnevezi a szkriptet, az új verzió felülírja az előző verziót.

  • A szkript helyi a munkafolyamatban. Ha ugyanazt a szkriptet más munkafolyamatokban szeretné használni, tekintse meg a szkriptfájlt a KuduPlus konzolon, majd másolja a szkriptet más munkafolyamatokban való újrahasználatra.

Korlátozások

Név szerint Határ Jegyzetek
Szkriptfuttatás időtartama 10 perc Ha olyan forgatókönyvei vannak, amelyek hosszabb időtartamot igényelnek, a termékvisszajelzési lehetőséggel további információt kaphat az igényeiről.
Kimeneti méret 100 MB A kimeneti méret a műveletek kimeneti méretkorlátjától függ, amely általában 100 MB.

A CSharp-szkriptkód végrehajtása művelet hozzáadása

  1. Az Azure Portalon nyissa meg a standard logikai alkalmazás erőforrását és munkafolyamatát a tervezőben.

  2. A tervezőben az alábbi általános lépéseket követve adja hozzá a CSharp-szkriptkód végrehajtása nevű beágyazott kódműveletet a munkafolyamathoz.

  3. A műveletinformációs ablaktábla megnyitása után a Paraméterek lap Kódfájl mezőjében frissítse az előre feltöltött mintakódot saját szkriptkódjával.

    Az alábbi példa a művelet Paraméterek lapját mutatja be a példaszkript kódjával:

    Képernyőkép az Azure Portalról, a Standard munkafolyamat-tervezőről, a Kérelem eseményindítójáról, a CSharp szkriptkódjának végrehajtásáról az információs panel megnyitásával és a Válasz művelettel. Az Információs ablaktábla a C# példaszkriptet jeleníti meg.

    Az alábbi példa a példaszkriptkódot mutatja be:

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

    További információ: "#r" – Referencia külső szerelvényekre.

  4. Ha végzett, mentse a munkafolyamatot.

A munkafolyamat futtatása után áttekintheti a munkafolyamat kimenetét az Application Insightsban, ha engedélyezve van. További információ: Naplók megtekintése az Application Insightsban.

Névterek importálása

A névterek importálásához tegye a szokásos módon a using záradékot. Az alábbi lista automatikusan importált névtereket tartalmaz, ezért nem kötelező, hogy szerepeljenek a szkriptben:

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

Külső szerelvényekre mutató hivatkozások hozzáadása

Az .NET-keretrendszer szerelvényekre való hivatkozáshoz használja az #r "<assembly-name> irányelvet, például:

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

Az alábbi lista tartalmazza az Azure Functions üzemeltetési környezet által automatikusan hozzáadott szerelvényeket:

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

Naplókimenet streambe

Run A metódusban adjon meg egy típussal és log névvel rendelkező ILogger paramétert, például:

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

Naplókimenet az Application Insightsba

Ha egyéni metrikákat szeretne létrehozni az Application Insightsban, használja a LogMetric bővítménymetódust a következő helyen ILogger: .

Az alábbi példa egy mintametódus-hívást mutat be:

logger.LogMetric("TestMetric", 1234);

Munkafolyamat-eseményindítók és műveleti kimenetek elérése a szkriptben

A munkafolyamat adatainak eléréséhez használja a környezeti objektumhoz WorkflowContext elérhető alábbi módszereket:

  • GetTriggerResults módszer

    Az eseményindító kimeneteinek eléréséhez használja ezt a metódust az eseményindítót és kimeneteit képviselő objektum visszaadásához, amely a Outputs tulajdonságon keresztül érhető el. Ez az objektum JObject típusú, és indexelőként használhatja a szögletes zárójeleket ([]) az eseményindító kimeneteinek különböző tulajdonságainak eléréséhez.

    Az alábbi példa lekéri az adatokat a body tulajdonságból az eseményindító kimeneteiben:

    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 módszer

    A műveletkimenetek eléréséhez ezzel a módszerrel visszaadhat egy objektumot, amely a műveletet és kimeneteit jelöli, amelyek a Outputs tulajdonságon keresztül érhetők el. Ez a metódus egy műveletnevet fogad el paraméterként. Az alábbi példa egy body műveletnév nevű művelet kimenetében lévő tulajdonságból szerzi be az adatokat:

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

Környezeti változók vagy alkalmazásbeállítási érték elérése

Környezeti változó vagy alkalmazásbeállítási érték lekéréséhez használja a System.Environment.GetEnvironmentVariable metódust, például:

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

Adatok visszaküldése a munkafolyamatba

Ehhez a feladathoz hajtsa végre a metódust Run egy visszatérési típussal és return utasítással. Ha aszinkron verziót szeretne, implementálja a Run metódust egy Task<return-type> attribútummal és a async kulcsszóval. A visszatérési érték a szkriptművelet body kimeneti tulajdonságára van állítva, amelyre a későbbi munkafolyamat-műveletek hivatkozhatnak.

Az alábbi példa egy Run attribútumot, kulcsszót async és utasítást tartalmazó Task<Results> metódust return mutat be:

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

A szkriptfájl megtekintése

  1. Az Azure Portalon nyissa meg a standard logikai alkalmazás erőforrását, amely rendelkezik a kívánt munkafolyamatokkal.

  2. A logikai alkalmazás erőforrásmenüjének Fejlesztési eszközök csoportjában válassza a Speciális eszközök lehetőséget.

  3. A Speciális eszközök lapon válassza az Ugrás lehetőséget, amely megnyitja a KuduPlus-konzolt.

  4. Nyissa meg a Hibakeresési konzol menüjét, és válassza a CMD lehetőséget.

  5. Nyissa meg a logikai alkalmazás gyökérhelyét: site/wwwroot

  6. Nyissa meg a munkafolyamat mappáját, amely tartalmazza a .csx fájlt a következő elérési út mentén: site/wwwroot/{workflow-name}

  7. A fájl neve mellett válassza a Szerkesztés lehetőséget a fájl megnyitásához és megtekintéséhez.

Naplók megtekintése az Application Insightsban

  1. Az Azure Portalon, a logikai alkalmazás erőforrásmenüjének Beállítások területén válassza az Application Insights lehetőséget, majd válassza ki a logikai alkalmazást.

  2. Az Application Insights menü Figyelés területén válassza a Naplók lehetőséget.

  3. Hozzon létre egy lekérdezést a munkafolyamat végrehajtásából származó nyomkövetések vagy hibák megkereséséhez, például:

    union traces, errors
    | project TIMESTAMP, message
    

Fordítási hibák

Ebben a kiadásban a webes szerkesztő korlátozott IntelliSense-támogatást tartalmaz, amely még fejlesztés alatt áll. A rendszer fordítási hibákat észlel a munkafolyamat mentésekor, és az Azure Logic Apps-futtatókörnyezet lefordítja a szkriptet. Ezek a hibák megjelennek a logikai alkalmazás hibanaplóiban.

Futtatókörnyezeti hibák

Ha a szkript végrehajtásakor hiba történik, az Azure Logic Apps végrehajtja az alábbi lépéseket:

  • Visszaadja a hibát a munkafolyamatnak.
  • A szkriptműveletet sikertelenként jelöli meg.
  • Egy hibaobjektumot biztosít, amely a szkriptből kidobott kivételt jelöli.

Az alábbi példa egy mintahibát mutat be:

A "CSharp_MyLogicApp-InvalidAction_execute_csharp_script_code.csx" függvény "A nem létező művelet nem létezik a munkafolyamatban" hibával meghiúsult. a végrehajtás során. Ellenőrizze, hogy a függvénykód érvényes-e.

Példaszkriptek

Az alábbi példaszkriptek különböző feladatokat hajtanak végre, amelyeket

ZIP-fájl kibontása szövegfájlokkal HTTP-műveletből sztringtömbbe

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

Adatok titkosítása az alkalmazásbeállításokból származó kulccsal

// 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 osztály

Munkafolyamat-környezetet jelöl.

Metódusok

GetActionResult(string actionName)

Lekéri a munkafolyamat egy adott műveletének eredményét.

Az aszinkron verzió a Feladatot<> használja visszatérési típusként, például:

Task<WorkflowOperationResult> GetActionResult(string actionName)

Paraméterek

actionName: A művelet neve.

Válaszok

Az aszinkron verzió egy Task olyan objektumot ad vissza, amely az aszinkron műveletet jelöli. A tevékenység eredménye egy objektumot WorkflowOperationResult tartalmaz. A WorkflowOperationResult objektum tulajdonságairól további információt a WorkflowOperationResult osztályban talál.

RunTriggerResult()

Lekéri a munkafolyamat eseményindítójának eredményét.

Az aszinkron verzió a Feladatot<> használja visszatérési típusként, például:

Task<WorkflowOperationResult> RunTriggerResult()

Paraméterek

Nincs.

Válaszok

Az aszinkron verzió egy Task olyan objektumot ad vissza, amely az aszinkron műveletet jelöli. A tevékenység eredménye egy objektumot WorkflowOperationResult tartalmaz. A WorkflowOperationResult objektum tulajdonságairól további információt a WorkflowOperationResult osztályban talál.

WorkflowOperationResult osztály

Munkafolyamat-művelet eredményét jelöli.

Tulajdonságok

Név Típus Leírás
Név Sztring Lekéri vagy beállítja a művelet nevét.
Bemenetek JToken Lekéri vagy beállítja a művelet végrehajtási bemeneteit.
Kimenetek JToken Lekéri vagy beállítja a műveletvégrehajtás kimeneteit.
StartTime DateTime? Lekéri vagy beállítja a művelet kezdési időpontját.
EndTime DateTime? Lekéri vagy beállítja a művelet befejezési idejét.
OperationTrackingId Sztring Lekéri vagy beállítja a műveletkövetési azonosítót.
Kód Sztring Lekéri vagy beállítja a művelet állapotkódját.
Állapot Sztring Lekéri vagy beállítja a művelet állapotát.
Hiba JToken Lekéri vagy beállítja a művelet hibáját.
TrackedProperties JToken Lekéri vagy beállítja a művelet nyomon követett tulajdonságait.

JavaScript-kódrészletek hozzáadása és futtatása