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)
Öppna din standardlogikappresurs och ditt arbetsflöde i designern i Azure-portalen.
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.
Överst i skriptet importerar du de nödvändiga namnrymderna och lägger till nödvändiga sammansättningsreferenser som vanligt.
Run
Implementera metoden:Metodnamnet
Run
är fördefinierat och arbetsflödet körs endast genom att anropa den här Körningsmetoden vid körning.För att komma åt data som kommer från arbetsflödet
Run
accepterar metoden dessa data via en parameter med typen WorkflowContext . Du kan använda objektet WorkflowContext för följande uppgifter:Om du vill returnera skriptets resultat eller andra data till arbetsflödet implementerar
Run
du metoden med en returtyp. Mer information finns i Returnera data till arbetsflödet.Om du vill logga utdata från skriptet i C# implementerar
Run
du metoden för att acceptera en funktionsloggare via en parameter medILogger
typen och använderlog
den som argumentnamn för enkel identifiering. Undvik att inkluderaConsole.Write
i skriptet.Viktigt!
Om du har ett långvarigt skript som kräver en korrekt avslutning om funktionsvärden stängs av, inkluderar du en annulleringstoken som krävs med funktionsloggaren.
Mer information finns i följande avsnitt:
I följande exempel visas fliken Parametrar för åtgärden med exempelskriptkoden:
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.
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
metodFö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
metodOm 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ånbody
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
I Azure-portalen öppnar du din standardlogikappresurs som har det arbetsflöde du vill ha.
På resursmenyn för logikappen går du till Utvecklingsverktyg och väljer Avancerade verktyg.
På sidan Avancerade verktyg väljer du Go, som öppnar KuduPlus-konsolen .
Öppna menyn Felsökningskonsol och välj CMD.
Gå till logikappens rotplats: site/wwwroot
Gå till arbetsflödets mapp, som innehåller .csx-filen, längs den här sökvägen: site/wwwroot/{workflow-name}
Bredvid filnamnet väljer du Redigera för att öppna och visa filen.
Visa loggar i Application Insights
I Azure-portalen går du till resursmenyn för logikappen under Inställningar, väljer Application Insights och sedan din logikapp.
På Menyn Application Insights går du till Övervakning och väljer Loggar.
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. |