Condividi tramite


Aggiungere ed eseguire script C# inline con flussi di lavoro Standard per App per la logica di Azure (anteprima)

Si applica a: App per la logica di Azure (standard)

Nota

Questa funzionalità è disponibile in anteprima ed è soggetta alle Condizioni per l'utilizzo supplementari per le anteprime di Microsoft Azure.

Per eseguire attività di integrazione personalizzate inline con il flusso di lavoro Standard in App per la logica di Azure, è possibile aggiungere ed eseguire script C# semplici dal flusso di lavoro nel portale di Azure. Per questa attività, usare l'azione Codice inline denominata Esegui codice CSharp. Questa azione restituisce il risultato dello script in modo da poter usare tale output nelle azioni successive del flusso di lavoro.

Questa funzionalità offre i vantaggi seguenti:

  • Scrivere script personalizzati per risolvere problemi di integrazione più complessi senza dover usare Funzioni di Azure.

    Questo vantaggio semplifica lo sviluppo del flusso di lavoro e riduce la complessità e i costi con la gestione di più servizi.

  • Distribuire script insieme ai flussi di lavoro. Non sono necessari altri piani di servizio.

Questa guida illustra come aggiungere l'azione nel flusso di lavoro e aggiungere il codice script C# da eseguire.

Prerequisiti

  • Account e sottoscrizione di Azure. Se non si ha una sottoscrizione, è possibile iscriversi per creare un account Azure gratuito.

  • Flusso di lavoro dell'app per la logica Standard in cui si vuole aggiungere lo script C#. Il flusso di lavoro deve già iniziare con un trigger. Per altre informazioni, vedere Creare flussi di lavoro di app per la logica Standard di esempio.

    È possibile usare qualsiasi trigger per lo scenario, ma, ad esempio, questa guida usa il trigger Di richiesta denominato Quando viene ricevuta una richiesta HTTP e anche l'azione Risposta . Il flusso di lavoro viene eseguito quando un'altra applicazione o flusso di lavoro invia una richiesta all'URL dell'endpoint del trigger. Lo script di esempio restituisce i risultati dell'esecuzione del codice come output che è possibile usare nelle azioni successive.

Scenari di esempio

L'elenco seguente descrive alcuni scenari di esempio in cui è possibile usare uno script aiuta con determinate attività di integrazione:

  • Analizzare ed eseguire trasformazioni o manipolazioni su un payload oltre alle funzionalità predefinite di espressioni e operazioni sui dati. Ad esempio, è possibile usare uno script per restituire uno schema modificato per l'elaborazione downstream.

  • Gestire le risorse di Azure, ad esempio le macchine virtuali e avviarle o eseguirne il passaggio, in base a una logica di business.

  • Eseguire una stored procedure in un server SQL che deve essere eseguito in base a una pianificazione e archiviare i risultati in SharePoint.

  • Registrare gli errori del flusso di lavoro con informazioni dettagliate salvando in Archiviazione di Azure o tramite posta elettronica o notificando al team.

  • Crittografare e decrittografare i dati per rispettare gli standard di sicurezza delle API.

  • Passare un file nello script per comprimere o decomprimere una richiesta HTTP.

  • Aggregare i dati da varie API e file per creare report giornalieri

Considerazioni

  • Il portale di Azure salva lo script come file di script C# (con estensione csx) nella stessa cartella del file workflow.json, che archivia la definizione JSON per il flusso di lavoro e distribuisce il file nella risorsa dell'app per la logica insieme alla definizione del flusso di lavoro. App per la logica di Azure compila questo file per rendere lo script pronto per l'esecuzione.

    Il formato di file con estensione csx consente di scrivere meno "boilerplate" e di concentrarsi solo sulla scrittura di una funzione C#. È possibile rinominare il file con estensione csx per semplificare la gestione durante la distribuzione. Tuttavia, ogni volta che si rinomina lo script, la nuova versione sovrascrive la versione precedente.

  • Lo script è locale per il flusso di lavoro. Per usare lo stesso script in altri flussi di lavoro, visualizzare il file di script nella console KuduPlus e quindi copiare lo script da riutilizzare in altri flussi di lavoro.

Limiti

Nome Limit Note
Durata esecuzione script 10 minuti Se si hanno scenari che richiedono durate più lunghe, usare l'opzione di feedback del prodotto per fornire altre informazioni sulle proprie esigenze.
Dimensioni output 100 MB Le dimensioni dell'output dipendono dal limite di dimensioni di output per le azioni, che in genere è di 100 MB.

Aggiungere l'azione Esegui codice script CSharp

  1. Nella portale di Azure aprire la risorsa e il flusso di lavoro dell'app per la logica Standard nella finestra di progettazione.

  2. Nella finestra di progettazione seguire questi passaggi generali per aggiungere l'azione Operazioni codice inline denominata Execute CSharp Script Code ( Esegui codice script CSharp) al flusso di lavoro.

  3. Dopo aver aperto il riquadro informazioni sull'azione, nella scheda Parametri , nella casella File di codice aggiornare il codice di esempio prepopocato con il codice script personalizzato.

    • Nella parte superiore dello script importare gli spazi dei nomi necessari e aggiungere eventuali riferimenti all'assembly necessari come di consueto.

    • Implementare il Run metodo :

      • Il nome del Run metodo è predefinito e il flusso di lavoro viene eseguito solo chiamando questo metodo Run in fase di esecuzione.

      • Per accedere ai dati provenienti dal flusso di lavoro, il Run metodo accetta questi dati tramite un parametro con tipo WorkflowContext . È possibile utilizzare l'oggetto WorkflowContext per le attività seguenti:

      • Per restituire i risultati dello script o altri dati al flusso di lavoro, implementare il Run metodo con un tipo restituito. Per altre informazioni, vedere Restituire dati al flusso di lavoro.

      • Per registrare l'output dello script in C#, implementare il Run metodo per accettare un logger di funzione tramite un parametro con ILogger tipo e usare log come nome dell'argomento per facilitare l'identificazione. Evitare di includere Console.Write nello script.

        Importante

        Se si dispone di uno script a esecuzione prolungata che richiede una terminazione normale nel caso in cui l'host della funzione si arresti, includere un token di annullamento, obbligatorio, con il logger di funzione.

        Per ulteriori informazioni, vedere le sezioni seguenti:

    L'esempio seguente mostra la scheda Parametri dell'azione con il codice di script di esempio:

    Screenshot che mostra portale di Azure, finestra di progettazione del flusso di lavoro standard, trigger di richiesta, azione Esegui codice script CSharp con riquadro informazioni aperto e Azione di risposta. Il riquadro Informazioni mostra lo script C# di esempio.

    L'esempio seguente illustra il codice di script di esempio:

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

    Per altre informazioni, vedere "#r" - Riferimenti ad assembly esterni.

  4. Al termine, salvare il flusso di lavoro.

Visualizzare il file di script

  1. Nella portale di Azure aprire la risorsa dell'app per la logica Standard con il flusso di lavoro desiderato.

  2. Nel menu delle risorse dell'app per la logica, in Strumenti di sviluppo selezionare Strumenti avanzati.

  3. Nella pagina Strumenti avanzati selezionare Vai, che apre la console KuduPlus.

  4. Aprire il menu Console di debug e selezionare CMD.

  5. Passare alla posizione radice dell'app per la logica: site/wwwroot

  6. Passare alla cartella del flusso di lavoro, che contiene il file csx, lungo questo percorso: site/wwwroot/{workflow-name}

  7. Accanto al nome del file selezionare Modifica per aprire e visualizzare il file.

Importare spazi dei nomi

Per importare gli spazi dei nomi, eseguire questa operazione con la using clausola come di consueto. L'elenco seguente include spazi dei nomi importati automaticamente, quindi sono facoltativi da includere nello script:

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

Aggiungere riferimenti ad assembly esterni

Per fare riferimento agli assembly .NET Framework, usare la #r "<assembly-name> direttiva , ad esempio:

/// 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, ILogger log)

L'elenco seguente include gli assembly aggiunti automaticamente dall'ambiente di hosting Funzioni di Azure:

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

Accedere agli output di trigger e azioni del flusso di lavoro nello script

Per accedere ai dati dal flusso di lavoro, usare i metodi seguenti disponibili per l'oggetto WorkflowContext contesto:

  • Metodo GetTriggerResults

    Per accedere agli output dei trigger, utilizzare questo metodo per restituire un oggetto che rappresenta il trigger e i relativi output, disponibili tramite la Outputs proprietà . Questo oggetto ha il tipo JObject ed è possibile usare le parentesi quadre ([]) dell'indicizzatore per accedere a varie proprietà negli output del trigger.

    Ad esempio, il codice di esempio seguente ottiene i dati dalla body proprietà negli output del trigger:

    public static async Task<Results> Run(WorkflowContext context, ILogger log)
    {
        var triggerOutputs = (await context.GetTriggerResults().ConfigureAwait(false)).Outputs;
        var body = triggerOutputs["body"];
    }
    
  • Metodo GetActionResults

    Per accedere agli output delle azioni, utilizzare questo metodo per restituire un oggetto che rappresenta l'azione e i relativi output, disponibili tramite la Outputs proprietà . Questo metodo accetta un nome di azione come parametro, ad esempio:

    public static async Task<Results> Run(WorkflowContext context, ILogger log)
    {
    
        var actionOutputs = (await context.GetActionResults("actionName").ConfigureAwait(false)).Outputs;
        var body = actionOutputs["body"];
    }
    

Accedere alle variabili di ambiente o al valore dell'impostazione dell'app

Per ottenere una variabile di ambiente o un valore di impostazione dell'app, usare il System.Environment.GetEnvironmentVariable metodo , ad esempio:

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

Restituire i dati al flusso di lavoro

Per questa attività, implementare il Run metodo con un tipo restituito. Se si desidera una versione asincrona, implementare il Run metodo come Task<>e impostare il valore restituito sul corpo degli output dell'azione script, a cui possono quindi fare riferimento le azioni successive del flusso di lavoro.

public static void 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;}
}

oppure

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

Registrare l'output in un flusso

Run Nel metodo includere un parametro con ILogger tipo e log come nome, ad esempio:

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

Registrare l'output in Application Insights

Per creare metriche personalizzate in Application Insights, usare il LogMetric metodo di estensione in ILogger.

L'esempio seguente mostra una chiamata di metodo di esempio:

logger.LogMetric("TestMetric", 1234);

Errori di compilazione

In questa versione, l'editor basato sul Web include un supporto IntelliSense limitato, che è ancora in fase di miglioramento. Eventuali errori di compilazione vengono rilevati quando si salva il flusso di lavoro e il runtime App per la logica di Azure compila lo script. Questi errori vengono visualizzati nei log degli errori dell'app per la logica.

Errori di runtime

Se si verifica un errore durante l'esecuzione dello script, App per la logica di Azure esegue questi passaggi:

  • Passa di nuovo l'errore al flusso di lavoro.
  • Contrassegna l'azione script come Non riuscita.
  • Fornisce un oggetto errore che rappresenta l'eccezione generata dallo script.

L'esempio seguente mostra un errore di esempio:

La funzione 'CSharp_MyLogicApp-InvalidAction_execute_csharp_script_code.csx' non è riuscita con l'errore 'L'azione 'inesistente' non esiste nel flusso di lavoro. durante l'esecuzione. Verificare che il codice della funzione sia valido.

Script di esempio

Gli script di esempio seguenti eseguono varie attività che è possibile eseguire

Decomprimere un file ZIP con file di testo da un'azione HTTP in una matrice di stringhe

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

Crittografare i dati usando una chiave dalle impostazioni dell'app

// 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());

        }
    }
}

Classe WorkflowContext

Rappresenta un contesto del flusso di lavoro.

Metodi

GetActionResult(string actionName)

Ottiene il risultato da un'azione specifica nel flusso di lavoro.

La versione asincrona usa Task<> come tipo restituito, ad esempio:

Task<WorkflowOperationResult> GetActionResult(string actionName)

Parametri

actionName: nome dell'azione.

Valori restituiti

La versione asincrona restituisce un Task oggetto che rappresenta l'operazione asincrona. Il risultato dell'attività contiene un WorkflowOperationResult oggetto . Per informazioni sulle proprietà dell'oggetto WorkflowOperationResult, vedere Classe WorkflowOperationResult.

RunTriggerResult()

Ottiene il risultato dal trigger nel flusso di lavoro.

La versione asincrona usa Task<> come tipo restituito, ad esempio:

Task<WorkflowOperationResult> RunTriggerResult()

Parametri

Nessuna.

Valori restituiti

La versione asincrona restituisce un Task oggetto che rappresenta l'operazione asincrona. Il risultato dell'attività contiene un WorkflowOperationResult oggetto . Per informazioni sulle proprietà dell'oggetto WorkflowOperationResult, vedere Classe WorkflowOperationResult.

Classe WorkflowOperationResult

Rappresenta il risultato di un'operazione del flusso di lavoro.

Proprietà

Nome Tipo Descrizione
Nome string Ottiene o imposta il nome dell'operazione.
Input JToken Ottiene o imposta gli input di esecuzione dell'operazione.
Output JToken Ottiene o imposta gli output di esecuzione dell'operazione.
StartTime DateTime? Ottiene o imposta l'ora di inizio dell'operazione.
EndTime DateTime? Ottiene o imposta l'ora di fine dell'operazione.
OperationTrackingId String Ottiene o imposta l'ID di rilevamento dell'operazione.
Codice String Ottiene o imposta il codice di stato per l'azione.
Stato String Ottiene o imposta lo stato dell'azione.
Errore JToken Ottiene o imposta l'errore per l'azione.
TrackedProperties JToken Ottiene o imposta le proprietà rilevate per l'azione.

Aggiungere ed eseguire frammenti di codice JavaScript