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
W witrynie Azure Portal otwórz zasób aplikacji logiki w warstwie Standardowa i przepływ pracy w projektancie.
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.
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 górnej części skryptu zaimportuj niezbędne przestrzenie nazw i dodaj wszystkie wymagane odwołania do zestawów w zwykły sposób.
Zaimplementuj metodę
Run
:Nazwa
Run
metody jest wstępnie zdefiniowana, a przepływ pracy jest wykonywany tylko przez wywołanie tej metody Run w czasie wykonywania.Aby uzyskać dostęp do danych pochodzących z przepływu pracy,
Run
metoda akceptuje te dane za pośrednictwem parametru z typem WorkflowContext . Dla następujących zadań można użyć obiektu WorkflowContext :Aby zwrócić wyniki skryptu lub inne dane do przepływu pracy, zaimplementuj
Run
metodę z typem zwracanym. Aby uzyskać więcej informacji, zobacz Zwracanie danych do przepływu pracy.Aby zarejestrować dane wyjściowe ze skryptu w języku C#, zaimplementuj
Run
metodę w celu zaakceptowania rejestratora funkcji za pomocą parametru zILogger
typem i użyjlog
jako nazwy argumentu w celu łatwej identyfikacji. Unikaj dołączaniaConsole.Write
do skryptu.Ważne
Jeśli masz długotrwały skrypt, który wymaga prawidłowego zakończenia w przypadku zamknięcia hosta funkcji, dołącz token anulowania, który jest wymagany z rejestratorem funkcji.
Aby uzyskać więcej informacji, zobacz następujące sekcje:
W poniższym przykładzie pokazano kartę Parametry akcji z przykładowym kodem skryptu:
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.
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
metodaAby 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
metodaAby 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 zbody
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
W witrynie Azure Portal otwórz zasób aplikacji logiki w warstwie Standardowa z żądanym przepływem pracy.
W menu zasobów aplikacji logiki w obszarze Narzędzia programistyczne wybierz pozycję Narzędzia zaawansowane.
Na stronie Narzędzia zaawansowane wybierz pozycję Przejdź, co spowoduje otwarcie konsoli KuduPlus.
Otwórz menu Konsola debugowania i wybierz pozycję CMD.
Przejdź do głównej lokalizacji aplikacji logiki: site/wwwroot
Przejdź do folderu przepływu pracy, który zawiera plik csx, wzdłuż tej ścieżki: site/wwwroot/{workflow-name}
Obok nazwy pliku wybierz pozycję Edytuj , aby otworzyć i wyświetlić plik.
Wyświetlanie dzienników w usłudze Application Insights
W witrynie Azure Portal w menu zasobów aplikacji logiki w obszarze Ustawienia wybierz pozycję Application Insights, a następnie wybierz aplikację logiki.
W menu usługi Application Insights w obszarze Monitorowanie wybierz pozycję Dzienniki.
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. |