Добавление и запуск скриптов C# в встроенных рабочих процессах уровня "Стандартный" для Azure Logic Apps (предварительная версия)
Область применения: Azure Logic Apps (стандартная версия)
Примечание.
Эта возможность входит в предварительную версию, и на нее распространяются Дополнительные условия использования предварительных версий Microsoft Azure.
Чтобы выполнять пользовательские задачи интеграции в рамках рабочего процесса уровня "Стандартный" в Azure Logic Apps, вы можете напрямую добавлять и запускать скрипты C# из рабочего процесса. Для этой задачи используйте действие встроенного кода с именем Execute CSharp Script Code. Это действие возвращает результаты из скрипта, чтобы вы могли использовать эти выходные данные в последующих действиях рабочего процесса.
Эта возможность обеспечивает следующие преимущества:
Создайте собственные скрипты в конструкторе рабочих процессов, чтобы решить более сложные проблемы интеграции без необходимости использовать Функции Azure. Другие планы обслуживания не нужны.
Это преимущество упрощает разработку рабочих процессов, а также снижает сложность и затраты с помощью управления дополнительными службами.
Создайте выделенный файл кода, который предоставляет персонализированное пространство сценариев в рабочем процессе.
Разверните скрипты вместе с рабочими процессами.
В этом руководстве показано, как добавить действие в рабочий процесс и добавить код скрипта C#, который требуется запустить.
Необходимые компоненты
Учетная запись и подписка Azure. Если у вас нет ее, вы можете зарегистрироваться для получения бесплатной учетной записи Azure.
Рабочий процесс приложения логики "Стандартный", в котором требуется добавить скрипт C#. Рабочий процесс уже должен начинаться с триггера. Дополнительные сведения см. в разделе "Создание примеров стандартных рабочих процессов приложения логики".
Для сценария можно использовать любой триггер, но в качестве примера в этом руководстве используется триггер запроса с именем "При получении HTTP-запроса", а также действие "Ответ ". Рабочий процесс запускается, когда другое приложение или рабочий процесс отправляет запрос на URL-адрес конечной точки триггера. Пример скрипта возвращает результаты выполнения кода в виде выходных данных, которые можно использовать в последующих действиях.
Пример сценариев
В следующем списке описаны некоторые примеры сценариев, в которых можно использовать скрипт для выполнения определенных задач интеграции:
Анализ и выполнение преобразований или манипуляций с полезными данными за пределами встроенных выражений и возможностей операций с данными. Например, можно использовать скрипт для возврата измененной схемы для последующей обработки.
Управление ресурсами Azure, такими как виртуальные машины и запуск или шаг, на основе какой-либо бизнес-логики.
Запустите хранимую процедуру на СЕРВЕРе SQL Server, который должен выполняться по расписанию и хранить результаты в SharePoint.
Журнал ошибок рабочего процесса с подробными сведениями, сохраняя их в служба хранилища Azure или на электронную почту или уведомляя свою команду.
Шифрование и расшифровка данных в соответствии со стандартами безопасности API.
Передайте файл в скрипт в ZIP-файл или распакуйте http-запрос.
Статистические данные из различных API и файлов для создания ежедневных отчетов
Рекомендации
Портал Azure сохраняет скрипт в виде файла скрипта C# (CSX) в той же папке, что и файл workflow.json, который сохраняет определение JSON для рабочего процесса и развертывает файл в ресурсе приложения логики вместе с определением рабочего процесса. Azure Logic Apps компилирует этот файл, чтобы скрипт был готов к выполнению.
Формат CSX-файла позволяет писать меньше "стандартных" и сосредоточиться только на написании функции C#. Вы можете переименовать CSX-файл для упрощения управления во время развертывания. Однако при каждом переименовании скрипта новая версия перезаписывает предыдущую версию.
Сценарий является локальным для рабочего процесса. Чтобы использовать тот же сценарий в других рабочих процессах, просмотрите файл скрипта в консоли KuduPlus, а затем скопируйте скрипт для повторного использования в других рабочих процессах.
Ограничения
Полное имя | Лимит | Примечания. |
---|---|---|
Длительность выполнения скрипта | 10 минут | Если у вас есть сценарии, требующие длительности, используйте вариант обратной связи продукта, чтобы предоставить дополнительные сведения о ваших потребностях. |
Размер выходных данных | 100 МБ | Размер выходных данных зависит от предельного размера выходных данных для действий, что обычно составляет 100 МБ. |
Добавление действия "Выполнение кода скрипта CSharp"
В портал Azure откройте ресурс приложения логики "Стандартный" и рабочий процесс в конструкторе.
В конструкторе выполните следующие общие действия, чтобы добавить действие "Встроенные операции кода" с именем Execute CSharp Script Code в рабочий процесс.
После открытия области сведений о действии на вкладке "Параметры " в поле "Файл кода" обновите предварительно заполненный пример кода с собственным кодом скрипта.
В верхней части скрипта импортируйте необходимые пространства имен и добавьте все необходимые ссылки на сборки как обычно.
Run
Реализуйте метод:Имя
Run
метода предопределено, и рабочий процесс выполняется только путем вызова этого метода Run во время выполнения.Чтобы получить доступ к данным, поступающим из рабочего процесса,
Run
метод принимает эти данные с помощью параметра с типом WorkflowContext . Объект WorkflowContext можно использовать для следующих задач:Доступ к выходным данным триггера, предыдущим выходным данным действия и рабочему процессу.
Доступ к переменным среды и значениям параметров приложения логики.
Чтобы вернуть результаты скрипта или другие данные в рабочий процесс, реализуйте
Run
метод с возвращаемым типом. Дополнительные сведения см. в разделе "Возврат данных в рабочий процесс".Чтобы записать выходные данные из скрипта в C#, реализуйте
Run
метод для принятия средства ведения журнала функций с помощью параметра сILogger
типом и используйтеlog
в качестве имени аргумента для простой идентификации. Избегайте включенияConsole.Write
в скрипт.Внимание
Если у вас есть длительный скрипт, требующий корректного завершения в случае завершения работы узла функции, добавьте маркер отмены, который требуется, с помощью средства ведения журнала функций.
Дополнительные сведения см. в следующих разделах:
В следующем примере показана вкладка "Параметры действия" с примером кода скрипта:
В следующем примере показан пример кода скрипта:
/// 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;} }
Дополнительные сведения см. в разделе "#r" — ссылка на внешние сборки.
По завершении сохраните рабочий процесс.
После запуска рабочего процесса можно просмотреть выходные данные рабочего процесса в Application Insights, если это включено. Дополнительные сведения см. в разделе "Просмотр журналов" в Application Insights.
Импорт пространств имен
Чтобы импортировать пространства имен, сделайте это с предложением using
как обычно. Следующий список включает автоматически импортированные пространства имен, поэтому они являются необязательными для включения в скрипт:
System
System.Collections.Generic
System.IO
System.Linq
System.Net.Http
System.Threading.Tasks
Microsoft.Azure.WebJobs
Microsoft.Azure.WebJobs.Host
Добавление ссылок на внешние сборки
Чтобы ссылаться на сборки платформа .NET Framework, используйте директиву#r "<assembly-name>
, например:
/// 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
{
<...>
}
Следующий список включает сборки, автоматически добавленные средой размещения Функции 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
Ведение журнала выходных данных в поток
Run
В методе добавьте параметр с ILogger
типом и log
именем, например:
public static void Run(WorkflowContext context, ILogger log)
{
log.LogInformation($"C# script successfully executed.");
}
Выходные данные журнала в Application Insights
Чтобы создать пользовательские метрики в Application Insights, используйте LogMetric
метод ILogger
расширения в .
В следующем примере показан пример вызова метода:
logger.LogMetric("TestMetric", 1234);
Доступ к триггеру рабочего процесса и выходным данным действия в скрипте
Чтобы получить доступ к данным из рабочего процесса, используйте следующие методы, доступные для объекта контекста WorkflowContext
:
GetTriggerResults
МетодЧтобы получить доступ к выходным данным триггера, используйте этот метод для возврата объекта, представляющего триггер и его выходные данные, доступные через
Outputs
свойство. Этот объект имеет тип JObject , и вы можете использовать квадратные скобки ([]) в качестве индексатора для доступа к различным свойствам в выходных данных триггера.Следующий пример получает данные из свойства в
body
выходных данных триггера: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
МетодЧтобы получить доступ к выходным данным действия, используйте этот метод для возврата объекта, представляющего действие и его выходные данные, доступные через
Outputs
свойство. Этот метод принимает имя действия в качестве параметра. Следующий пример получает данные изbody
свойства в выходных данных из имени действия с именем действия: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 { <...> }
Доступ к переменным среды или значению параметра приложения
Чтобы получить переменную среды или значение параметра приложения, используйте System.Environment.GetEnvironmentVariable
этот метод, например:
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);
}
Возврат данных в рабочий процесс
Для этой задачи реализуйте Run
метод с возвращаемым типом и return
оператором. Если требуется асинхронная версия, реализуйте Run
метод с атрибутом Task<return-type>
и ключевым словом async
. Возвращаемое значение присваивается свойству выходных body
данных действия скрипта, на которое затем могут ссылаться любые последующие действия рабочего процесса.
В следующем примере показан метод с атрибутом Task<Results>
Run
, async
ключевым словом и оператором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;}
}
Просмотр файла скрипта
В портал Azure откройте ресурс приложения логики "Стандартный", имеющий нужный рабочий процесс.
В меню ресурсов приложения логики в разделе "Средства разработки" выберите "Дополнительные средства".
На странице "Дополнительные средства" выберите "Перейти", который открывает консоль KuduPlus.
Откройте меню консоли отладки и выберите CMD.
Перейдите в корневое расположение приложения логики: сайт/wwwroot
Перейдите в папку рабочего процесса, содержащую CSX-файл, по этому пути: site/wwwroot/{workflow-name}
Рядом с именем файла нажмите кнопку "Изменить ", чтобы открыть файл и просмотреть его.
Просмотр журналов Application Insights
В портал Azure в меню ресурсов приложения логики в разделе "Параметры" выберите Application Insights и выберите приложение логики.
В меню Application Insights в разделе "Мониторинг" выберите "Журналы".
Создайте запрос для поиска трассировок или ошибок из выполнения рабочего процесса, например:
union traces, errors | project TIMESTAMP, message
Ошибки компиляции
В этом выпуске веб-редактор включает ограниченную поддержку IntelliSense, которая по-прежнему находится под улучшением. Все ошибки компиляции обнаруживаются при сохранении рабочего процесса, а среда выполнения Azure Logic Apps компилирует скрипт. Эти ошибки отображаются в журналах ошибок приложения логики.
Ошибки среды выполнения
Если при выполнении скрипта возникает ошибка, Azure Logic Apps выполняет следующие действия:
- Передает ошибку обратно в рабочий процесс.
- Помечает действие скрипта как сбой.
- Предоставляет объект ошибки, представляющий исключение, вызванное скриптом.
В следующем примере показана пример ошибки:
Функция "CSharp_MyLogicApp-InvalidAction_execute_csharp_script_code.csx" завершилась ошибкой "Несуществующее действие не существует в рабочем процессе". при выполнении. Убедитесь, что код функции действителен.
Примеры скриптов
В следующем примере скрипты выполняют различные задачи, которые могут выполняться
Распаковка ZIP-файла с текстовыми файлами из действия HTTP в массив строк
// 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;
}
Шифрование данных с помощью ключа из параметров приложения
// 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
Представляет контекст рабочего процесса.
Методы
GetActionResult(string actionName)
Возвращает результат конкретного действия в рабочем процессе.
Асинхронная версия использует task<> в качестве возвращаемого типа, например:
Task<WorkflowOperationResult> GetActionResult(string actionName)
Параметры
actionName
: имя действия.
Возвраты
Асинхронная версия возвращает Task
объект, представляющий асинхронную операцию. Результат задачи содержит WorkflowOperationResult
объект. Сведения о свойствах объекта WorkflowOperationResult см. в классе WorkflowOperationResult.
RunTriggerResult()
Возвращает результат триггера в рабочем процессе.
Асинхронная версия использует task<> в качестве возвращаемого типа, например:
Task<WorkflowOperationResult> RunTriggerResult()
Параметры
Нет.
Возвраты
Асинхронная версия возвращает Task
объект, представляющий асинхронную операцию. Результат задачи содержит WorkflowOperationResult
объект. Сведения о свойствах объекта WorkflowOperationResult см. в классе WorkflowOperationResult.
Класс WorkflowOperationResult
Представляет результат операции рабочего процесса.
Свойства
Имя. | Тип | Description |
---|---|---|
Имя | Строка | Возвращает или задает имя операции. |
Входные данные | JToken | Возвращает или задает входные данные выполнения операции. |
Выходные данные | JToken | Возвращает или задает выходные данные выполнения операции. |
StartTime | DateTime? | Возвращает или задает время начала операции. |
EndTime | DateTime? | Возвращает или задает время окончания операции. |
OperationTrackingId | Строка | Возвращает или задает идентификатор отслеживания операций. |
Код | Строка | Возвращает или задает код состояния для действия. |
Состояние | Строка | Возвращает или задает состояние действия. |
Ошибка | JToken | Возвращает или задает ошибку для действия. |
TrackedProperties | JToken | Возвращает или задает отслеживаемые свойства для действия. |