C#-scripts inline toevoegen en uitvoeren met Standard-werkstromen voor Azure Logic Apps (preview)
Van toepassing op: Azure Logic Apps (Standard)
Notitie
Deze mogelijkheid is in preview en is onderworpen aan de aanvullende gebruiksvoorwaarden voor Microsoft Azure Previews.
Als u aangepaste integratietaken inline wilt uitvoeren met uw Standaardwerkstroom in Azure Logic Apps, kunt u C#-scripts rechtstreeks vanuit uw werkstroom toevoegen en uitvoeren. Gebruik voor deze taak de actie Inline Code uitvoeren met de naam CSharp-scriptcode uitvoeren. Deze actie retourneert de resultaten van uw script, zodat u deze uitvoer kunt gebruiken in de volgende acties van uw werkstroom.
Deze mogelijkheid biedt de volgende voordelen:
Schrijf uw eigen scripts in de werkstroomontwerper, zodat u complexere integratieproblemen kunt oplossen zonder Azure Functions te hoeven gebruiken. Er zijn geen andere serviceplannen nodig.
Dit voordeel stroomlijnt de ontwikkeling van werkstromen en vermindert de complexiteit en kosten met het beheren van meer services.
Genereer een toegewezen codebestand, dat een gepersonaliseerde scriptruimte in uw werkstroom biedt.
Implementeer scripts naast uw werkstromen.
In deze handleiding ziet u hoe u de actie toevoegt aan uw werkstroom en hoe u de C#-scriptcode toevoegt die u wilt uitvoeren.
Vereisten
Een Azure-account en -abonnement. Als u nog geen abonnement hebt, meld u dan aan voor een gratis Azure-account.
De werkstroom voor de logische standaard-app waar u uw C#-script wilt toevoegen. De werkstroom moet al beginnen met een trigger. Zie Voorbeeldwerkstromen voor logische apps maken voor meer informatie.
U kunt elke trigger voor uw scenario gebruiken, maar in deze handleiding wordt de aanvraagtrigger met de naam Wanneer een HTTP-aanvraag wordt ontvangen en ook de actie Antwoord gebruikt. De werkstroom wordt uitgevoerd wanneer een andere toepassing of werkstroom een aanvraag naar de eindpunt-URL van de trigger verzendt. Het voorbeeldscript retourneert de resultaten van code-uitvoering als uitvoer die u in volgende acties kunt gebruiken.
Voorbeeldscenario's
In de volgende lijst worden enkele voorbeeldscenario's beschreven waarin u een script kunt gebruiken voor bepaalde integratietaken:
Parseer en voer transformaties of manipulaties uit op een nettolading buiten de ingebouwde expressies en mogelijkheden voor gegevensbewerkingen. U kunt bijvoorbeeld een script gebruiken om een gewijzigd schema te retourneren voor downstreamverwerking.
Beheer Azure-resources, zoals virtuele machines, en start of stap deze, op basis van bepaalde bedrijfslogica.
Voer een opgeslagen procedure uit op een SQL-server die volgens een planning moet worden uitgevoerd en sla de resultaten op in SharePoint.
Logboekwerkstroomfouten met gedetailleerde informatie door op te slaan in Azure Storage of uw team te e-mailen of op de hoogte te stellen.
Gegevens versleutelen en ontsleutelen om te voldoen aan API-beveiligingsstandaarden.
Geef een bestand door aan het script om een HTTP-aanvraag te zippen of uit te pakken.
Gegevens uit verschillende API's en bestanden aggregeren om dagelijkse rapporten te maken
Overwegingen
Azure Portal slaat uw script op als een C#-scriptbestand (.csx) in dezelfde map als uw workflow.json-bestand , waarin de JSON-definitie voor uw werkstroom wordt opgeslagen en het bestand samen met de werkstroomdefinitie wordt geïmplementeerd in de resource van uw logische app. Azure Logic Apps compileert dit bestand om het script gereed te maken voor uitvoering.
Met de .csx-bestandsindeling kunt u minder 'standaard' schrijven en zich richten op het schrijven van een C#-functie. U kunt de naam van het .csx-bestand wijzigen voor eenvoudiger beheer tijdens de implementatie. Telkens wanneer u de naam van het script wijzigt, wordt de vorige versie echter overschreven door de nieuwe versie.
Het script is lokaal voor de werkstroom. Als u hetzelfde script in andere werkstromen wilt gebruiken, bekijkt u het scriptbestand in de KuduPlus-console en kopieert u het script om het opnieuw te gebruiken in andere werkstromen.
Beperkingen
Naam | Limiet | Opmerkingen |
---|---|---|
Duur van scriptuitvoering | 10 minuten | Als u scenario's hebt die langere duur nodig hebben, gebruikt u de optie voor productfeedback om meer informatie over uw behoeften te geven. |
Uitvoergrootte | 100 MB | De uitvoergrootte is afhankelijk van de uitvoergroottelimiet voor acties, die over het algemeen 100 MB zijn. |
De actie CSharp-scriptcode uitvoeren toevoegen
Open in Azure Portal de resource en werkstroom van uw standaard logische app in de ontwerpfunctie.
Volg deze algemene stappen in de ontwerpfunctie om de actie Inline-codebewerkingen met de naam CSharp-scriptcode uitvoeren toe te voegen aan uw werkstroom.
Nadat het deelvenster actiegegevens is geopend, werkt u op het tabblad Parameters in het vak Codebestand de vooraf ingevulde voorbeeldcode bij met uw eigen scriptcode.
Importeer bovenaan het script de benodigde naamruimten en voeg eventuele vereiste assemblyverwijzingen zoals gebruikelijk toe.
Implementeer de
Run
methode:De naam van de
Run
methode is vooraf gedefinieerd en uw werkstroom wordt alleen uitgevoerd door deze run-methode tijdens runtime aan te roepen.Voor toegang tot gegevens die afkomstig zijn van uw werkstroom, accepteert de
Run
methode deze gegevens via een parameter met het type WorkflowContext . U kunt het WorkflowContext-object gebruiken voor de volgende taken:Uitvoer van access-triggers, voorgaande actie-uitvoer en uw werkstroom.
Toegang tot omgevingsvariabelen en waarden voor het instellen van logische apps.
Als u de resultaten of andere gegevens van het script wilt retourneren aan uw werkstroom, implementeert u de
Run
methode met een retourtype. Zie Gegevens retourneren naar uw werkstroom voor meer informatie.Als u de uitvoer van uw script in C# wilt vastleggen, implementeert u de
Run
methode voor het accepteren van een functielogger via een parameter metILogger
type en gebruiktlog
u deze als argumentnaam voor eenvoudige identificatie. Vermijd het opnemenConsole.Write
in uw script.Belangrijk
Als u een langlopend script hebt waarvoor een respijtende beëindiging is vereist voor het geval de functiehost wordt afgesloten, neemt u een annuleringstoken op dat is vereist met uw functielogger.
Zie de volgende secties voor meer informatie:
In het volgende voorbeeld ziet u het tabblad Parameters van de actie met de voorbeeldscriptcode:
In het volgende voorbeeld ziet u de voorbeeldscriptcode:
/// 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;} }
Zie '#r' voor meer informatie: verwijzen naar externe assembly's.
Sla uw werkstroom op wanneer u klaar bent.
Nadat u uw werkstroom hebt uitgevoerd, kunt u de uitvoer van de werkstroom controleren in Application Insights, indien ingeschakeld. Zie Logboeken weergeven in Application Insights voor meer informatie.
Naamruimten importeren
Als u naamruimten wilt importeren, moet u dit doen met de using
component zoals gebruikelijk. De volgende lijst bevat automatisch geïmporteerde naamruimten, zodat u deze optioneel kunt opnemen in uw script:
System
System.Collections.Generic
System.IO
System.Linq
System.Net.Http
System.Threading.Tasks
Microsoft.Azure.WebJobs
Microsoft.Azure.WebJobs.Host
Verwijzingen toevoegen aan externe assembly's
Als u wilt verwijzen naar .NET Framework-assembly's, gebruikt u de #r "<assembly-name>
instructie, bijvoorbeeld:
/// 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
{
<...>
}
De volgende lijst bevat assembly's die automatisch worden toegevoegd door de Azure Functions-hostingomgeving:
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
Logboekuitvoer naar een stream
Neem in uw Run
methode een parameter op met ILogger
het type en log
als de naam, bijvoorbeeld:
public static void Run(WorkflowContext context, ILogger log)
{
log.LogInformation($"C# script successfully executed.");
}
Logboekuitvoer naar Application Insights
Als u aangepaste metrische gegevens wilt maken in Application Insights, gebruikt u de LogMetric
extensiemethode op ILogger
.
In het volgende voorbeeld ziet u een voorbeeldmethode-aanroep:
logger.LogMetric("TestMetric", 1234);
Uitvoer van werkstroomtriggers en -acties in uw script openen
Als u toegang wilt krijgen tot gegevens uit uw werkstroom, gebruikt u de volgende methoden die beschikbaar zijn voor het WorkflowContext
contextobject:
GetTriggerResults
methodeGebruik deze methode om toegang te krijgen tot triggeruitvoer om een object te retourneren dat de trigger en de uitvoer vertegenwoordigt, die beschikbaar zijn via de
Outputs
eigenschap. Dit object heeft het JObject-type en u kunt de vierkante haken ([]) als indexeerfunctie gebruiken voor toegang tot verschillende eigenschappen in de triggeruitvoer.In het volgende voorbeeld worden de gegevens opgehaald uit de
body
eigenschap in de triggeruitvoer: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
methodeAls u actie-uitvoer wilt openen, gebruikt u deze methode om een object te retourneren dat de actie en de uitvoer vertegenwoordigt, die beschikbaar zijn via de
Outputs
eigenschap. Deze methode accepteert een actienaam als parameter. In het volgende voorbeeld worden de gegevens opgehaald uit debody
eigenschap in de uitvoer van een actie met de naam 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 { <...> }
Toegang tot omgevingsvariabelen of app-instellingswaarde
Als u een omgevingsvariabele of app-instellingswaarde wilt ophalen, gebruikt u de System.Environment.GetEnvironmentVariable
methode, bijvoorbeeld:
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);
}
Gegevens retourneren aan uw werkstroom
Implementeer voor deze taak uw Run
methode met een retourtype en return
instructie. Als u een asynchrone versie wilt, implementeert u de Run
methode met een Task<return-type>
kenmerk en het async
trefwoord. De retourwaarde wordt ingesteld op de uitvoereigenschap body
van de scriptactie, waarnaar eventuele volgende werkstroomacties vervolgens kunnen verwijzen.
In het volgende voorbeeld ziet u een Run
methode met een Task<Results>
kenmerk, het async
trefwoord en een return
instructie:
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;}
}
Het scriptbestand weergeven
Open in Azure Portal de resource voor de logische standaard-app met de gewenste werkstroom.
Selecteer Geavanceerde hulpprogramma's in het resourcemenu van de logische app onder Ontwikkelhulpprogramma's.
Selecteer Go op de pagina Geavanceerde hulpprogramma's, waarmee de KuduPlus-console wordt geopend.
Open het consolemenu Foutopsporing en selecteer CMD.
Ga naar de hoofdlocatie van uw logische app: site/wwwroot
Ga naar de map van uw werkstroom, die het CSX-bestand bevat, langs dit pad: site/wwwroot/{workflow-name}
Selecteer Naast de bestandsnaam Bewerken om het bestand te openen en weer te geven.
Logboeken weergeven in Application Insights
Selecteer in Azure Portal, in het resourcemenu van de logische app, onder Instellingen, Application Insights en selecteer vervolgens uw logische app.
Selecteer Logboeken in het menu Application Insights onder Bewaking.
Maak een query om traceringen of fouten te vinden die afkomstig zijn van de uitvoering van uw werkstroom, bijvoorbeeld:
union traces, errors | project TIMESTAMP, message
Compilatiefouten
In deze release bevat de webeditor beperkte IntelliSense-ondersteuning, die nog steeds wordt verbeterd. Eventuele compilatiefouten worden gedetecteerd wanneer u uw werkstroom opslaat en de Azure Logic Apps-runtime compileert uw script. Deze fouten worden weergegeven in de foutenlogboeken van uw logische app.
Runtimefouten
Als er een fout optreedt wanneer uw script wordt uitgevoerd, voert Azure Logic Apps de volgende stappen uit:
- Geeft de fout weer door aan uw werkstroom.
- Markeert de scriptactie als Mislukt.
- Biedt een foutobject dat de uitzondering vertegenwoordigt die is gegenereerd vanuit uw script.
In het volgende voorbeeld ziet u een voorbeeldfout:
De functie 'CSharp_MyLogicApp-InvalidAction_execute_csharp_script_code.csx' is mislukt met de fout 'De actie 'niet-bestaand' bestaat niet in de werkstroom.' bij het uitvoeren. Controleer of de functiecode geldig is.
Voorbeeldscripts
In de volgende voorbeeldscripts worden verschillende taken uitgevoerd die u kunt uitvoeren
Een ZIP-bestand decomprimeren met tekstbestanden van een HTTP-actie in een tekenreeksmatrix
// 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;
}
Gegevens versleutelen met behulp van een sleutel uit app-instellingen
// 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-klasse
Vertegenwoordigt een werkstroomcontext.
Methoden
GetActionResult(tekenreeks actionName)
Hiermee haalt u het resultaat op van een specifieke actie in de werkstroom.
De asynchrone versie gebruikt Taak<> als het retourtype, bijvoorbeeld:
Task<WorkflowOperationResult> GetActionResult(string actionName)
Parameters
actionName
: De naam van de actie.
Retouren
De asynchrone versie retourneert een Task
object dat de asynchrone bewerking vertegenwoordigt. Het taakresultaat bevat een WorkflowOperationResult
object. Zie de klasse WorkflowOperationResult voor informatie over de objecteigenschappen workflowOperationResult.
RunTriggerResult()
Hiermee haalt u het resultaat op van de trigger in de werkstroom.
De asynchrone versie gebruikt Taak<> als het retourtype, bijvoorbeeld:
Task<WorkflowOperationResult> RunTriggerResult()
Parameters
Geen.
Retouren
De asynchrone versie retourneert een Task
object dat de asynchrone bewerking vertegenwoordigt. Het taakresultaat bevat een WorkflowOperationResult
object. Zie de klasse WorkflowOperationResult voor informatie over de objecteigenschappen workflowOperationResult.
WorkflowOperationResult-klasse
Vertegenwoordigt het resultaat van een werkstroombewerking.
Eigenschappen
Name | Type | Description |
---|---|---|
Naam | String | Hiermee haalt u de naam van de bewerking op of stelt u deze in. |
Ingangen | JToken | Hiermee haalt u de uitvoerinvoer van de bewerking op of stelt u deze in. |
Uitvoer | JToken | Hiermee haalt u de uitvoer van de bewerking op of stelt u deze in. |
StartTime | Datum/tijd? | Hiermee haalt u de begintijd van de bewerking op of stelt u deze in. |
EndTime | Datum/tijd? | Hiermee haalt u de eindtijd van de bewerking op of stelt u deze in. |
OperationTrackingId | String | Hiermee haalt u de tracerings-id van de bewerking op of stelt u deze in. |
Code | String | Hiermee haalt u de statuscode voor de actie op of stelt u deze in. |
-Status | String | Hiermee haalt u de status voor de actie op of stelt u deze in. |
Fout | JToken | Hiermee haalt u de fout voor de actie op of stelt u deze in. |
TrackedProperties | JToken | Hiermee haalt u de bijgehouden eigenschappen voor de actie op of stelt u deze in. |