Поделиться через


Добавление и запуск скриптов 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"

  1. В портал Azure откройте ресурс приложения логики "Стандартный" и рабочий процесс в конструкторе.

  2. В конструкторе выполните следующие общие действия, чтобы добавить действие "Встроенные операции кода" с именем Execute CSharp Script Code в рабочий процесс.

  3. После открытия области сведений о действии на вкладке "Параметры " в поле "Файл кода" обновите предварительно подготовленный пример кода с собственным кодом скрипта.

    В следующем примере показана вкладка "Параметры действия" с примером кода скрипта:

    Снимок экрана: портал Azure, конструктор стандартных рабочих процессов, триггер запроса, действие

    В следующем примере показан пример кода скрипта:

    /// 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" — ссылка на внешние сборки.

  4. По завершении сохраните рабочий процесс.

После запуска рабочего процесса можно просмотреть выходные данные рабочего процесса в 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;}
}

Просмотр файла скрипта

  1. В портал Azure откройте ресурс приложения логики "Стандартный", имеющий нужный рабочий процесс.

  2. В меню ресурсов приложения логики в разделе "Средства разработки" выберите "Дополнительные средства".

  3. На странице "Дополнительные средства" выберите "Перейти", который открывает консоль KuduPlus.

  4. Откройте меню консоли отладки и выберите CMD.

  5. Перейдите в корневое расположение приложения логики: сайт/wwwroot

  6. Перейдите в папку рабочего процесса, содержащую CSX-файл, по этому пути: site/wwwroot/{workflow-name}

  7. Рядом с именем файла нажмите кнопку "Изменить ", чтобы открыть файл и просмотреть его.

Просмотр журналов Application Insights

  1. В портал Azure в меню ресурсов приложения логики в разделе "Параметры" выберите Application Insights и выберите приложение логики.

  2. В меню Application Insights в разделе "Мониторинг" выберите "Журналы".

  3. Создайте запрос для поиска трассировок или ошибок из выполнения рабочего процесса, например:

    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 Возвращает или задает отслеживаемые свойства для действия.

Добавление и запуск фрагментов кода JavaScript