Vai al contenuto

Nuova Funzionalità: Script .NET C# Inline per Azure Logic Apps (Standard) – Anteprima

Scopri la nuova funzionalità che permette di scrivere script .NET C# direttamente nel designer di Azure Logic Apps, migliorando l’integrazione e la flessibilità.

La recente introduzione della possibilità di scrivere script .NET C# direttamente all’interno del designer di Azure Logic Apps rappresenta un significativo passo avanti per gli sviluppatori. Questa nuova funzionalità si affianca alla già esistente capacità di invocare funzioni .NET FX e NET8, offrendo una maggiore flessibilità e potenza nella creazione di soluzioni di integrazione complesse.

Vantaggi della Nuova Funzionalità

Questa nuova capacità offre diversi benefici:

  • Estensione della strategia di estensibilità: Fornisce agli sviluppatori gli strumenti necessari per risolvere i problemi di integrazione più complessi, mantenendo un’esperienza di sviluppo fluida all’interno del portale Azure.
  • Nessun piano aggiuntivo richiesto: Come per il codice personalizzato, è possibile scrivere il proprio codice direttamente nel designer senza necessità di piani aggiuntivi.
  • Integrazione con Azure Functions: Basata sulla capacità di script C# di Azure Functions, eredita molte delle sue funzionalità.

Attualmente, il codice script viene eseguito all’interno del processo host di Azure Function e non supporta ancora il riferimento a assembly personalizzati. Tuttavia, è possibile accedere a tutti gli assembly del framework e a Newtonsoft.Json per le esigenze di serializzazione. Il supporto per i riferimenti a assembly personalizzati sarà aggiunto prima che questa funzionalità diventi generalmente disponibile.

Aggiungere Script C# nel Workflow

Nel designer di Azure Logic Apps, è ora disponibile una nuova azione chiamata “Execute CSharp Script Code” sotto “Inline Code”. Selezionando questa azione, si aprirà un editor di codice che inizierà con del codice “boilerplate” per guidare gli sviluppatori nella scrittura del loro primo script C# in Logic App.

Il codice script viene salvato come file .csx nella stessa cartella del file workflow.json e viene distribuito insieme alla definizione del workflow. Durante l’inizializzazione della Logic App, questo file di codice verrà compilato e pronto per l’esecuzione.

Come Funziona lo Scripting

Il formato .csx consente di scrivere meno codice “boilerplate” e di concentrarsi sulla scrittura di una funzione C#. Invece di racchiudere tutto in uno spazio dei nomi e una classe, basta definire un metodo Run. Includere eventuali riferimenti a assembly e spazi dei nomi all’inizio del file come di consueto. Il nome di questo metodo è predefinito e il workflow può invocare solo questo metodo Run durante l’esecuzione.

Flusso di Dati nel Metodo Run

I dati del workflow fluiscono nel metodo Run attraverso il parametro di tipo WorkflowContext. Oltre al contesto del workflow, è possibile includere un logger di funzione come parametro e un token di cancellazione, necessario se lo script è di lunga durata e deve essere terminato in modo sicuro in caso di arresto dell’host della funzione.

Restituire Dati al Workflow

Il metodo Run può avere un tipo di ritorno e può anche essere un Task se si desidera che il metodo sia asincrono. Il valore di ritorno verrà quindi impostato come corpo degli output dell’azione script che eventuali azioni successive possono fare riferimento.

Limiti

Durata Il tuo script può essere eseguito per un massimo di 10 minuti. Facci sapere se hai scenari che richiedono durate più lunghe.
Outputs La dimensione dell’output è soggetta al limite di dimensione degli output delle azioni (100MB).

Logging

Per registrare l’output nei log di streaming in C#, includere un argomento di tipo ILogger. Si consiglia di nominarlo log. Evitare di utilizzare Console.Write nel proprio script.

Importare Spazi dei Nomi

Se è necessario importare spazi dei nomi, è possibile farlo come di consueto, con la clausola using. I seguenti spazi dei nomi sono automaticamente importati e quindi opzionali:

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

Riferimenti a Assembly Esterni

Per gli assembly del framework, aggiungere riferimenti utilizzando la direttiva #r “AssemblyName”. Gli assembly seguenti sono automaticamente aggiunti dall’ambiente di hosting di 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

Variabili di Ambiente

Per ottenere una variabile di ambiente o un valore di impostazione dell’app, utilizzare System.Environment.GetEnvironmentVariable, come mostrato nel seguente esempio di codice:

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

Errori di Compilazione

L’editor web ha un supporto limitato per IntelliSense al momento e stiamo lavorando per migliorarlo man mano che questa funzionalità diventa generalmente disponibile. Qualsiasi errore di compilazione verrà quindi rilevato al momento del salvataggio quando il runtime della logic app compila lo script. Questi errori appariranno nei log di errore della tua logic app.

Errori di Runtime

Qualsiasi errore che si verifica durante l’esecuzione dello script verrà propagato al workflow e l’azione script verrà contrassegnata come fallita con l’oggetto errore che rappresenta l’eccezione lanciata dal tuo script.

Esempi di Script

Decompressione di un file ZIP contenente più file di testo recuperati da un’azione HTTP in un array di stringhe
// Aggiungi le librerie richieste #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; public static async Task<List> Run(WorkflowContext context) {     var outputs = (await context.GetActionResults("HTTP_1").ConfigureAwait(false)).Outputs;     var base64zipFileContent = outputs["body"]["$content"].ToString();     byte[] zipBytes = Convert.FromBase64String(base64zipFileContent);     List fileContents = new List();     using (MemoryStream zipStream = new MemoryStream(zipBytes))     {         using (ZipArchive zipArchive = new ZipArchive(zipStream))         {             foreach (ZipArchiveEntry entry in zipArchive.Entries)             {                 using (StreamReader reader = new StreamReader(entry.Open()))                 {                     string fileContent = reader.ReadToEnd();                     fileContents.Add(fileContent);                 }             }         }     }     return fileContents; }
Crittografare i Dati utilizzando una Chiave dalle Impostazioni dell’App
// Aggiungi le librerie richieste #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; public static async Task 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());         }     } }

Appendice

Classe WorkflowContext

Rappresenta il contesto di un workflow.

Metodi

  • Task<WorkflowOperationResult> GetActionResult(string actionName): Ottiene il risultato di una specifica azione all’interno del workflow.
  • Task<WorkflowOperationResult> RunTriggerResult(): Ottiene il risultato del trigger del workflow.

Proprietà della Classe WorkflowOperationResult

  • string Name: Ottiene o imposta il nome dell’operazione.
  • JToken Inputs: Ottiene o imposta gli input dell’esecuzione dell’operazione.
  • JToken Outputs: Ottiene o imposta gli output dell’esecuzione dell’operazione.
  • DateTime? StartTime: Ottiene o imposta l’ora di inizio dell’operazione.
  • DateTime? EndTime: Ottiene o imposta l’ora di fine dell’operazione.
  • string OperationTrackingId: Ottiene o imposta l’ID di tracciamento dell’operazione.
  • string Code: Ottiene o imposta il codice di stato dell’azione.
  • string Status: Ottiene o imposta lo stato dell’azione.
  • JToken Error: Ottiene o imposta l’errore dell’azione.
  • JToken TrackedProperties: Ottiene o imposta le proprietà tracciate dell’azione.