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 szkripttel segíthet bizonyos integrációs feladatokban:
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
Az Azure Portalon nyissa meg a standard logikai alkalmazás erőforrását és munkafolyamatát a tervezőben.
Miután megnyílik a műveletinformációs panel, 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.
A szkript tetején importálja a szükséges névtereket, és a szokásos módon adja hozzá a szükséges szerelvényhivatkozásokat.
Run
A módszer implementálása:A
Run
metódus neve előre definiálva van, és a munkafolyamat csak a futtatási metódus futásidőben történő meghívásával hajtja végre.A munkafolyamatból származó adatok eléréséhez a
Run
metódus egy WorkflowContext típusú paraméteren keresztül fogadja el ezeket az adatokat. A WorkflowContext objektumot a következő feladatokhoz használhatja:Ha vissza szeretné adni a szkript eredményeit vagy egyéb adatait a munkafolyamatnak, implementálja a
Run
metódust egy visszatérési típussal. További információ: Adatok visszaküldése a munkafolyamatba.Ha c#-ban szeretné naplózni a szkript kimenetét, implementálja azt a
Run
metódust, amely egy függvénynaplózót fogad el egy típussal rendelkező paraméterenILogger
keresztül, és argumentumnévként használjalog
az egyszerű azonosításhoz. Kerülje a szkriptbe való belevéséstConsole.Write
.Fontos
Ha hosszú ideig futó szkripttel rendelkezik, amely kecses befejezést igényel a függvénygazda leállítása esetén, adjon meg egy szükséges lemondási jogkivonatot a függvénynaplózóhoz.
További információt a következő szakaszokban talál:
Az alábbi példa a művelet Paraméterek lapját mutatja be a példaszkript kódjával:
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.
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ódszerAz 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ódszerA 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 egybody
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
Az Azure Portalon nyissa meg a standard logikai alkalmazás erőforrását, amely rendelkezik a kívánt munkafolyamatokkal.
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.
A Speciális eszközök lapon válassza az Ugrás lehetőséget, amely megnyitja a KuduPlus-konzolt.
Nyissa meg a Hibakeresési konzol menüjét, és válassza a CMD lehetőséget.
Nyissa meg a logikai alkalmazás gyökérhelyét: site/wwwroot
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}
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
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.
Az Application Insights menü Figyelés területén válassza a Naplók lehetőséget.
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. |