Dodawanie i uruchamianie skryptów języka C# w tekście przy użyciu standardowych przepływów pracy dla usługi Azure Logic Apps (wersja zapoznawcza)

Dotyczy: Azure Logic Apps (Standardowa)

Uwaga

Ta funkcja jest dostępna w wersji zapoznawczej i podlega dodatkowym warunkom użytkowania wersji zapoznawczej platformy Microsoft Azure.

Aby wykonywać niestandardowe zadania integracji wbudowane za pomocą przepływu pracy w warstwie Standardowa w usłudze Azure Logic Apps, możesz bezpośrednio dodawać i uruchamiać skrypty języka C# z poziomu przepływu pracy. W tym zadaniu użyj akcji Śródwierszowy kod o nazwie Wykonaj kod skryptu CSharp. Ta akcja zwraca wyniki ze skryptu, aby można było użyć tych danych wyjściowych w kolejnych akcjach przepływu pracy.

Ta funkcja zapewnia następujące korzyści:

  • Napisz własne skrypty w projektancie przepływu pracy, aby można było rozwiązać bardziej złożone wyzwania związane z integracją bez konieczności korzystania z usługi Azure Functions. Nie są potrzebne żadne inne plany usług.

    Ta korzyść usprawnia opracowywanie przepływów pracy oraz zmniejsza złożoność i koszty związane z zarządzaniem większą ilością usług.

  • Wygeneruj dedykowany plik kodu, który zapewnia spersonalizowaną przestrzeń skryptów w przepływie pracy.

  • Wdróż skrypty obok przepływów pracy.

W tym przewodniku pokazano, jak dodać akcję w przepływie pracy i dodać kod skryptu języka C#, który chcesz uruchomić.

Wymagania wstępne

  • Konto i subskrypcja platformy Azure. Jeśli nie masz subskrypcji, zarejestruj się w celu założenia bezpłatnego konta platformy Azure.

  • Przepływ pracy standardowej aplikacji logiki, w którym chcesz dodać skrypt języka C#. Przepływ pracy musi już rozpoczynać się od wyzwalacza. Aby uzyskać więcej informacji, zobacz Tworzenie przykładowych przepływów pracy aplikacji logiki w warstwie Standardowa.

    W tym scenariuszu można użyć dowolnego wyzwalacza, ale na przykład w tym przewodniku jest używany wyzwalacz żądania o nazwie Po odebraniu żądania HTTP, a także akcji Odpowiedź. Przepływ pracy jest uruchamiany, gdy inna aplikacja lub przepływ pracy wysyła żądanie do adresu URL punktu końcowego wyzwalacza. Przykładowy skrypt zwraca wyniki wykonania kodu jako dane wyjściowe, których można użyć w kolejnych akcjach.

Przykładowe scenariusze

Na poniższej liście opisano kilka przykładowych scenariuszy, w których można użyć skryptu, pomaga w niektórych zadaniach integracji:

  • Analizowanie i wykonywanie przekształceń lub manipulacji ładunkiem wykracza poza wbudowane wyrażenia i możliwości operacji danych. Na przykład można użyć skryptu, aby zwrócić zmodyfikowany schemat do przetwarzania podrzędnego.

  • Zarządzanie zasobami platformy Azure, takimi jak maszyny wirtualne, i uruchamianie ich lub wykonywanie kroków na podstawie logiki biznesowej.

  • Uruchom procedurę składowaną na serwerze SQL, który musi być uruchamiany zgodnie z harmonogramem i zapisz wyniki w programie SharePoint.

  • Rejestruj błędy przepływu pracy ze szczegółowymi informacjami, zapisując dane w usłudze Azure Storage lub wysyłając wiadomość e-mail lub powiadamiając zespół.

  • Szyfrowanie i odszyfrowywanie danych w celu zachowania zgodności ze standardami zabezpieczeń interfejsu API.

  • Przekaż plik do skryptu, aby spakować lub rozpakować żądanie HTTP.

  • Agregowanie danych z różnych interfejsów API i plików w celu tworzenia codziennych raportów

Kwestie wymagające rozważenia

  • Witryna Azure Portal zapisuje skrypt jako plik skryptu języka C# (csx) w tym samym folderze co plik workflow.json , który przechowuje definicję JSON dla przepływu pracy i wdraża plik w zasobie aplikacji logiki wraz z definicją przepływu pracy. Usługa Azure Logic Apps kompiluje ten plik, aby skrypt był gotowy do wykonania.

    Format pliku csx umożliwia pisanie mniej "standardowy" i skupianie się tylko na pisaniu funkcji języka C#. Możesz zmienić nazwę pliku csx, aby ułatwić zarządzanie podczas wdrażania. Jednak za każdym razem, gdy zmieniasz nazwę skryptu, nowa wersja zastępuje poprzednią wersję.

  • Skrypt jest lokalny dla przepływu pracy. Aby użyć tego samego skryptu w innych przepływach pracy, wyświetl plik skryptu w konsoli KuduPlus, a następnie skopiuj skrypt do ponownego użycia w innych przepływach pracy.

Ograniczenia

Nazwisko Ograniczenie Uwagi
Czas trwania uruchamiania skryptu 10 min Jeśli masz scenariusze, które wymagają dłuższego czasu trwania, użyj opcji opinii o produkcie, aby uzyskać więcej informacji na temat Twoich potrzeb.
Rozmiar danych wyjściowych 100 MB Rozmiar danych wyjściowych zależy od limitu rozmiaru danych wyjściowych dla akcji, czyli zazwyczaj 100 MB.

Dodawanie akcji Wykonaj kod skryptu CSharp

  1. W witrynie Azure Portal otwórz zasób aplikacji logiki w warstwie Standardowa i przepływ pracy w projektancie.

  2. W projektancie wykonaj następujące ogólne kroki, aby dodać akcję Operacje kodu wbudowanego o nazwie Wykonaj kod skryptu CSharp do przepływu pracy.

  3. Po otworze okienka informacji o akcji na karcie Parametry w polu Plik kodu zaktualizuj wstępnie wypełniony przykładowy kod własnym kodem skryptu.

    W poniższym przykładzie pokazano kartę Parametry akcji z przykładowym kodem skryptu:

    Zrzut ekranu przedstawiający witrynę Azure Portal, standardowy projektant przepływu pracy, wyzwalacz żądania, akcję Wykonaj kod skryptu CSharp z otwartym okienkiem informacji i akcją Odpowiedź. Okienko informacji zawiera przykładowy skrypt języka C#.

    Poniższy przykład przedstawia przykładowy kod skryptu:

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

    Aby uzyskać więcej informacji, zobacz "#r" — odwołania do zestawów zewnętrznych.

  4. Po zakończeniu zapisz przepływ pracy.

Po uruchomieniu przepływu pracy możesz przejrzeć dane wyjściowe przepływu pracy w usłudze Application Insights, jeśli są włączone. Aby uzyskać więcej informacji, zobacz Wyświetlanie dzienników w usłudze Application Insights.

Importowanie przestrzeni nazw

Aby zaimportować przestrzenie nazw, należy to zrobić przy użyciu klauzuli using jak zwykle. Poniższa lista zawiera automatycznie zaimportowane przestrzenie nazw, dlatego są opcjonalne, aby dołączyć je do skryptu:

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

Dodawanie odwołań do zestawów zewnętrznych

Aby odwołać się do zestawów .NET Framework, użyj #r "<assembly-name> dyrektywy, na przykład:

/// 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
{
    <...>
}

Poniższa lista zawiera zestawy automatycznie dodane przez środowisko hostingu usługi 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

Rejestrowanie danych wyjściowych strumienia

W metodzie Run dołącz parametr z ILogger typem i log nazwą, na przykład:

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

Rejestrowanie danych wyjściowych w usłudze Application Insights

Aby utworzyć metryki niestandardowe w usłudze Application Insights, użyj LogMetric metody rozszerzenia w pliku ILogger.

W poniższym przykładzie pokazano przykładowe wywołanie metody:

logger.LogMetric("TestMetric", 1234);

Uzyskiwanie dostępu do wyzwalacza przepływu pracy i danych wyjściowych akcji w skrycie

Aby uzyskać dostęp do danych z przepływu pracy, użyj następujących metod dostępnych dla WorkflowContext obiektu kontekstu:

  • GetTriggerResults metoda

    Aby uzyskać dostęp do danych wyjściowych wyzwalacza, użyj tej metody, aby zwrócić obiekt reprezentujący wyzwalacz i jego dane wyjściowe, które są dostępne za pośrednictwem Outputs właściwości . Ten obiekt ma typ JObject i można użyć nawiasów kwadratowych ([]) jako indeksatora, aby uzyskać dostęp do różnych właściwości w danych wyjściowych wyzwalacza.

    Poniższy przykład pobiera dane z body właściwości w danych wyjściowych wyzwalacza:

    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 metoda

    Aby uzyskać dostęp do danych wyjściowych akcji, użyj tej metody, aby zwrócić obiekt reprezentujący akcję i jego dane wyjściowe, które są dostępne za pośrednictwem Outputs właściwości . Ta metoda akceptuje nazwę akcji jako parametr. Poniższy przykład pobiera dane z body właściwości w danych wyjściowych z akcji o nazwie 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
    {
        <...>
    }
    

Uzyskiwanie dostępu do zmiennych środowiskowych lub wartości ustawienia aplikacji

Aby uzyskać zmienną środowiskową lub wartość ustawienia aplikacji, użyj System.Environment.GetEnvironmentVariable metody, na przykład:

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

Zwracanie danych do przepływu pracy

W tym zadaniu zaimplementuj Run metodę za pomocą zwracanego typu i return instrukcji. Jeśli chcesz użyć wersji asynchronicznej, zaimplementuj Run metodę za pomocą Task<return-type> atrybutu i słowa kluczowego async . Wartość zwracana jest ustawiona na właściwość outputs body akcji skryptu, do której mogą się odwoływać wszystkie kolejne akcje przepływu pracy.

W poniższym przykładzie przedstawiono metodę Run z atrybutem Task<Results> , async słowem kluczowym i instrukcją 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;}
}

Wyświetlanie pliku skryptu

  1. W witrynie Azure Portal otwórz zasób aplikacji logiki w warstwie Standardowa z żądanym przepływem pracy.

  2. W menu zasobów aplikacji logiki w obszarze Narzędzia programistyczne wybierz pozycję Narzędzia zaawansowane.

  3. Na stronie Narzędzia zaawansowane wybierz pozycję Przejdź, co spowoduje otwarcie konsoli KuduPlus.

  4. Otwórz menu Konsola debugowania i wybierz pozycję CMD.

  5. Przejdź do głównej lokalizacji aplikacji logiki: site/wwwroot

  6. Przejdź do folderu przepływu pracy, który zawiera plik csx, wzdłuż tej ścieżki: site/wwwroot/{workflow-name}

  7. Obok nazwy pliku wybierz pozycję Edytuj , aby otworzyć i wyświetlić plik.

Wyświetlanie dzienników w usłudze Application Insights

  1. W witrynie Azure Portal w menu zasobów aplikacji logiki w obszarze Ustawienia wybierz pozycję Application Insights, a następnie wybierz aplikację logiki.

  2. W menu usługi Application Insights w obszarze Monitorowanie wybierz pozycję Dzienniki.

  3. Utwórz zapytanie, aby znaleźć wszelkie ślady lub błędy z wykonania przepływu pracy, na przykład:

    union traces, errors
    | project TIMESTAMP, message
    

Błędy kompilacji

W tej wersji edytor internetowy zawiera ograniczoną obsługę funkcji IntelliSense, która jest nadal poprawa. Wszelkie błędy kompilacji są wykrywane podczas zapisywania przepływu pracy, a środowisko uruchomieniowe usługi Azure Logic Apps kompiluje skrypt. Te błędy są wyświetlane w dziennikach błędów aplikacji logiki.

Błędy środowiska uruchomieniowego

Jeśli wystąpi błąd podczas wykonywania skryptu, usługa Azure Logic Apps wykonuje następujące kroki:

  • Przekazuje błąd z powrotem do przepływu pracy.
  • Oznacza akcję skryptu jako Niepowodzenie.
  • Zawiera obiekt błędu reprezentujący wyjątek zgłoszony przez skrypt.

W poniższym przykładzie pokazano przykładowy błąd:

Funkcja "CSharp_MyLogicApp-InvalidAction_execute_csharp_script_code.csx" nie powiodła się z powodu błędu "Akcja "brak" nie istnieje w przepływie pracy. podczas wykonywania. Sprawdź, czy kod funkcji jest prawidłowy.

Przykładowe skrypty

Poniższe przykładowe skrypty wykonują różne zadania, które można wykonać

Dekompresuj plik ZIP z plikami tekstowymi z akcji HTTP do tablicy ciągów

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

Szyfrowanie danych przy użyciu klucza z ustawień aplikacji

// 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, klasa

Reprezentuje kontekst przepływu pracy.

Metody

GetActionResult(string actionName)

Pobiera wynik z określonej akcji w przepływie pracy.

Wersja asynchroniczna używa funkcji Task<> jako typu zwracanego, na przykład:

Task<WorkflowOperationResult> GetActionResult(string actionName)

Parametry

actionName: nazwa akcji.

Zwraca

Wersja asynchroniczna zwraca obiekt reprezentujący operację Task asynchroniczną. Wynik zadania zawiera WorkflowOperationResult obiekt. Aby uzyskać informacje o właściwościach obiektu WorkflowOperationResult , zobacz WorkflowOperationResult, klasa.

RunTriggerResult()

Pobiera wynik z wyzwalacza w przepływie pracy.

Wersja asynchroniczna używa funkcji Task<> jako typu zwracanego, na przykład:

Task<WorkflowOperationResult> RunTriggerResult()

Parametry

Brak.

Zwraca

Wersja asynchroniczna zwraca obiekt reprezentujący operację Task asynchroniczną. Wynik zadania zawiera WorkflowOperationResult obiekt. Aby uzyskać informacje o właściwościach obiektu WorkflowOperationResult , zobacz WorkflowOperationResult, klasa.

WorkflowOperationResult, klasa

Reprezentuje wynik operacji przepływu pracy.

Właściwości

Nazwisko Pisz opis
Nazwa/nazwisko String Pobiera lub ustawia nazwę operacji.
Wejścia JToken Pobiera lub ustawia dane wejściowe wykonywania operacji.
Dane wyjściowe JToken Pobiera lub ustawia dane wyjściowe wykonywania operacji.
Godzina rozpoczęcia Data/godzina? Pobiera lub ustawia godzinę rozpoczęcia operacji.
Godzina zakończenia Data/godzina? Pobiera lub ustawia godzinę zakończenia operacji.
OperationTrackingId String Pobiera lub ustawia identyfikator śledzenia operacji.
Kod String Pobiera lub ustawia kod stanu akcji.
Stan String Pobiera lub ustawia stan akcji.
Błąd JToken Pobiera lub ustawia błąd dla akcji.
Śledzone właściwości JToken Pobiera lub ustawia śledzone właściwości akcji.

Dodawanie i uruchamianie fragmentów kodu JavaScript