Ajouter et exécuter des scripts C# inline avec des flux de travail Standard pour Azure Logic Apps (préversion)
S’applique à : Azure Logic Apps (Standard)
Remarque
Cette fonctionnalité est en préversion et est soumise aux conditions d’utilisation supplémentaires des préversions de Microsoft Azure.
Pour effectuer des tâches d’intégration personnalisées en ligne avec votre flux de travail Standard dans Azure Logic Apps, vous pouvez ajouter et exécuter directement des scripts C# à partir de votre flux de travail. Pour cette tâche, utilisez l’action Code Inline nommée Exécuter le code de script CSharp. Cette action retourne les résultats de votre script afin de vous permettre d’utiliser cette sortie dans les actions suivantes de votre flux de travail.
Cette fonctionnalité offre les avantages suivants :
Écrivez vos propres scripts dans le Concepteur de flux de travail afin de pouvoir résoudre des problèmes d’intégration plus complexes sans avoir à utiliser Azure Functions. Aucun autre plan de service n’est nécessaire.
Cet avantage simplifie le développement de flux de travail et réduit la complexité et le coût de la gestion d’un plus grand nombre de services.
Générez un fichier de code dédié, qui fournit un espace de script personnalisé dans votre flux de travail.
Déployez des scripts en même temps que vos flux de travail.
Ce guide montre comment ajouter l’action dans votre flux de travail et ajouter le code de script C# que vous souhaitez exécuter.
Prérequis
Un compte et un abonnement Azure. Si vous n’avez pas encore d’abonnement, vous pouvez vous inscrire pour obtenir un compte Azure gratuitement.
Flux de travail d’application logique standard dans lequel vous souhaitez ajouter votre script C#. Le workflow doit déjà commencer par un déclencheur. Pour plus d’informations, consultez Créer des exemples de flux de travail d’application logique standard.
Vous pouvez utiliser n’importe quel déclencheur pour votre scénario, mais, par exemple, ce guide utilise le déclencheur de Requête nommé Lorsqu’une requête HTTP est reçue et également l’action Réponse. Le flux de travail s’exécute lorsqu’une autre application ou flux de travail envoie une requête à l’URL du point de terminaison du déclencheur. L’exemple de script retourne les résultats de l’exécution du code en tant que sortie que vous pouvez utiliser dans les actions suivantes.
Exemples de scénarios
La liste suivante décrit certains exemples de scénarios dans lesquels vous pouvez utiliser un script vous aide à effectuer certaines tâches d’intégration :
Analysez et effectuez des transformations ou des manipulations sur une charge utile au-delà des fonctionnalités intégrées des expressions et des opérations de données. Par exemple, vous pouvez utiliser un script pour retourner un schéma modifié pour le traitement en aval.
Gérez des ressources Azure telles que des machines virtuelles et démarrez-les ou effectuez des étapes en fonction d’une logique métier.
Exécutez une procédure stockée sur un serveur SQL qui doit s’exécuter selon une planification et stockez les résultats sur SharePoint.
Consignez les erreurs de flux de travail avec des informations détaillées en enregistrant dans Stockage Azure ou en envoyant un e-mail ou en informant votre équipe.
Chiffrer et déchiffrer les données pour se conformer aux normes de sécurité des API.
Transmettez un fichier dans le script pour compresser ou décompresser une requête HTTP.
Agréger des données provenant de diverses API et fichiers pour créer des rapports quotidiens
À propos de l’installation
Le portail Azure enregistre votre script en tant que fichier de script C# (.csx) dans le même dossier que votre fichier workflow.json, qui stocke la définition JSON de votre flux de travail et déploie le fichier dans votre ressource d’application logique, ainsi que la définition de flux de travail. Azure Logic Apps compile ce fichier pour préparer le script à l’exécution.
Le format de fichier .csx vous permet d’écrire moins de « code réutilisable » et de vous concentrer sur l’écriture d’une fonction C#. Vous pouvez renommer le fichier .csx pour faciliter la gestion pendant le déploiement. Toutefois, chaque fois que vous renommez le script, la nouvelle version remplace la version précédente.
Le script est local dans le flux de travail. Pour utiliser le même script dans d’autres flux de travail, afficher le fichier de script dans la console KuduPlus, puis copier le script pour le réutiliser dans d’autres flux de travail.
Limites
Nom | Limite | Remarques |
---|---|---|
Durée de l’exécution du script | 10 minutes | Si vous avez des scénarios qui nécessitent des durées plus longues, utilisez l’option de commentaires sur le produit pour fournir plus d’informations sur vos besoins. |
Taille de sortie | 100 Mo | La taille de sortie dépend de la limite de taille de sortie pour les actions, qui est généralement de 100 Mo. |
Ajouter l’action Exécuter le code de script CSharp
Sur le portail Azure, ouvrez votre application logique Standard et votre flux de travail dans le concepteur.
Dans le concepteur, suivez ces étapes générales pour ajouter l’action Opérations de code inline appelée Exécuter le code de script CSharp à votre flux de travail.
Une fois le volet d’informations d’action ouvert, sous l’onglet Paramètres, dans la zone Fichier de code, mettez à jour l’exemple de code prépoplué avec votre propre code de script.
En haut du script, importez les espaces de noms nécessaires et ajoutez les références d’assembly requises comme d’habitude.
Implémentez la méthode
Run
:Le nom de la méthode
Run
est prédéfini et votre flux de travail s’exécute uniquement en appelant cette méthode Exécuter au moment de l’exécution.Pour accéder aux données provenant de votre flux de travail, la méthode
Run
accepte ces données par le biais d’un paramètre avec le type WorkflowContext. Vous pouvez utiliser l’objet WorkflowContext pour les tâches suivantes :Pour renvoyer les résultats du script ou d’autres données à votre flux de travail, implémentez la méthode
Run
avec un type de retour. Pour plus d’informations, consultez Retourner des données à votre flux de travail.Pour consigner la sortie de votre script en C#, implémentez la méthode
Run
pour accepter un enregistreur d’événements de fonction via un paramètre avec typeILogger
et utilisezlog
comme nom d’argument pour faciliter l’identification. Évitez d’inclureConsole.Write
dans votre script.Important
Si vous disposez d’un script de longue durée qui nécessite une terminaison normale au cas où l’hôte de fonction s’arrête, incluez un jeton d’annulation, ce qui est requis, avec votre enregistreur d’événements de fonction.
Pour plus d'informations, consultez les sections suivantes :
L’exemple suivant montre l’onglet Paramètres de l’action avec l’exemple de code de script :
L’exemple suivant montre l’exemple de code de script :
/// 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;} }
Pour plus d’informations, consultez « #r » - Référencer des assemblys externes.
Lorsque vous avez terminé, enregistrez votre flux de travail.
Après avoir exécuté votre flux de travail, vous pouvez passer en revue la sortie du flux de travail dans Application Insights, s’il est activé. Pour plus d’informations, consultez Afficher les journaux dans Application Insights.
Importer des espaces de noms
Pour importer des espaces de noms, procédez ainsi avec la clause using
comme d’habitude. La liste suivante inclut des espaces de noms importés automatiquement. Vous pouvez donc les inclure dans votre script :
System
System.Collections.Generic
System.IO
System.Linq
System.Net.Http
System.Threading.Tasks
Microsoft.Azure.WebJobs
Microsoft.Azure.WebJobs.Host
Ajouter des références à des assemblys externes
Pour référencer des assemblys .NET Framework, utilisez la directive #r "<assembly-name>
, par exemple :
/// 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
{
<...>
}
La liste suivante inclut les assemblys automatiquement ajoutés par l’environnement d’hébergement 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
Sortie du journal vers un flux
Dans votre méthode Run
, incluez un paramètre avec type ILogger
et log
comme nom, par exemple :
public static void Run(WorkflowContext context, ILogger log)
{
log.LogInformation($"C# script successfully executed.");
}
Sortie de journal vers Application Insights
Pour créer des métriques personnalisées dans Application Insights, utilisez la méthode d’extension LogMetric
sur ILogger
.
L’exemple suivant montre un exemple d’appel de méthode :
logger.LogMetric("TestMetric", 1234);
Accéder aux sorties de déclencheur et d’action de flux de travail dans votre script
Pour accéder aux données à partir de votre flux de travail, utilisez les méthodes suivantes disponibles pour l’objet de contexte WorkflowContext
:
Méthode
GetTriggerResults
Pour accéder aux sorties du déclencheur, utilisez cette méthode pour renvoyer un objet qui représente le déclencheur et ses sorties, qui sont disponibles via la propriété
Outputs
. Cet objet a le type JObject, et vous pouvez utiliser les crochets ([]) comme indexeur pour accéder à diverses propriétés dans les sorties du déclencheur.L’exemple suivant obtient les données de la propriété
body
dans les sorties du déclencheur :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 { <...> }
Méthode
GetActionResults
Pour accéder aux sorties d’action, utilisez cette méthode pour renvoyer un objet qui représente l’action et ses sorties, qui sont disponibles via la propriété
Outputs
. Cette méthode accepte un nom d’action comme paramètre. L’exemple suivant obtient les données de la propriétébody
dans les sorties d’une action appelée nom-action :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 { <...> }
Accéder aux variables d’environnement ou à la valeur du paramètre d’application
Pour obtenir une variable d’environnement ou une valeur de paramètre d’application, utilisez la méthode System.Environment.GetEnvironmentVariable
, par exemple :
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);
}
Retourner des données à votre flux de travail
Pour cette tâche, implémentez votre méthode Run
avec un type de retour et une instruction return
. Si vous souhaitez une version asynchrone, implémentez la méthode Run
avec un attribut Task<return-type>
et le mot clé async
. La valeur de retour est définie dans la propriété body
des sorties de l’action de script, que toutes les actions de flux de travail suivantes peuvent ensuite référencer.
L’exemple suivant montre une méthode Run
avec un attribut Task<Results>
, le mot clé async
et une instruction return
:
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;}
}
Afficher le fichier de script
Dans le portail Azure, ouvrez votre ressource d’application logique Standard avec le flux de travail souhaité.
Dans le menu des ressources de l’application logique, sous Outils de développement, sélectionnez Outils Avancés.
Dans la page Outils avancés, sélectionnez Go, qui ouvre la console KuduPlus.
Ouvrez le menu de la console de débogage, puis sélectionnez CMD.
Accédez à l’emplacement racine de votre application logique : site/wwwroot
Accédez au dossier de votre workflow, qui contient le fichier .csx, le long de ce chemin : site/wwwroot/{workflow-name}
En regard du nom de fichier, sélectionnez Modifier pour ouvrir et afficher le fichier.
Afficher les journaux d’activité dans Application Insights
Dans le portail Azure, dans le menu de ressources de l’application logique, sous Paramètres, sélectionnez Application Insights, puis votre application logique.
Dans le menu Application Insights, sous Surveillance, sélectionnez Journaux.
Créez une requête pour rechercher des traces ou des erreurs dans l’exécution de votre flux de travail, par exemple :
union traces, errors | project TIMESTAMP, message
Erreurs de compilation
Dans cette version, l’éditeur web inclut une prise en charge limitée d’IntelliSense, qui est toujours en cours d’amélioration. Toutes les erreurs de compilation sont détectées lorsque vous enregistrez votre flux de travail et que le runtime Azure Logic Apps compile votre script. Ces erreurs apparaissent dans les journaux d’erreurs de votre application logique.
Erreurs d’exécution
Si une erreur se produit lorsque votre script s’exécute, Azure Logic Apps effectue les étapes suivantes :
- Transmet l’erreur à votre flux de travail.
- Marque l’action de script comme Échec.
- Fournit un objet d’erreur qui représente l’exception levée à partir de votre script.
L’exemple suivant illustre un exemple d’erreur :
La fonction « CSharp_MyLogicApp-InvalidAction_execute_csharp_script_code.csx » a échoué avec l’erreur « L’action "inexistante" n’existe pas dans le flux de travail. » lors de l’exécution. Vérifiez que le code de fonction est valide.
Exemples de scripts
Les exemples de scripts suivants effectuent différentes tâches que vous pouvez effectuer
Décompresser un fichier ZIP avec des fichiers texte d’une action HTTP dans un tableau de chaînes
// 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;
}
Chiffrer des données à l’aide d’une clé à partir des paramètres de l’application
// 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
Représente un contexte de flux de travail.
Méthodes
GetActionResult(string actionName)
Obtient le résultat d’une action spécifique dans le flux de travail.
La version asynchrone utilise Tâche<> comme type de retour, par exemple :
Task<WorkflowOperationResult> GetActionResult(string actionName)
Paramètres
actionName
: nom de l’action.
Retours
La version asynchrone retourne un objet Task
qui représente l’opération asynchrone. Le résultat de la tâche contient un objet WorkflowOperationResult
. Pour plus d’informations sur les propriétés de l’objet WorkflowOperationResult, consultez classe WorkflowOperationResult.
RunTriggerResult()
Obtient le résultat du déclencheur dans le flux de travail.
La version asynchrone utilise Tâche<> comme type de retour, par exemple :
Task<WorkflowOperationResult> RunTriggerResult()
Paramètres
Aucune.
Retours
La version asynchrone retourne un objet Task
qui représente l’opération asynchrone. Le résultat de la tâche contient un objet WorkflowOperationResult
. Pour plus d’informations sur les propriétés de l’objet WorkflowOperationResult, consultez classe WorkflowOperationResult.
Classe WorkflowOperationResult
Représente le résultat d’une opération de flux de travail.
Propriétés
Nom | Type | Description |
---|---|---|
Nom | Chaîne | Obtient ou définit le nom de l’opération. |
Entrées | JToken | Obtient ou définit les entrées d’exécution de l’opération. |
Sorties | JToken | Obtient ou définit les sorties d’exécution de l’opération. |
StartTime | DateTime? | Obtient ou définit l’heure de début de l’opération. |
EndTime | DateTime? | Obtient ou définit l’heure de fin de l’opération. |
OperationTrackingId | Chaîne | Obtient ou définit l’ID de suivi des opérations. |
Code | Chaîne | Obtient ou définit le code d’état de l’action. |
État | Chaîne | Obtient ou définit l’état de l’action. |
Error | JToken | Obtient ou définit l’erreur pour l’action. |
TrackedProperties | JToken | Obtient ou définit les propriétés suivies pour l’action. |