Бөлісу құралы:


Создание и запуск кода .NET из рабочих процессов уровня "Стандартный" в Azure Logic Apps

Область применения: Azure Logic Apps (стандартная версия)

Для решений интеграции, в которых необходимо создать и запустить код .NET из рабочего процесса приложения логики Уровня "Стандартный", можно использовать Visual Studio Code с расширением Azure Logic Apps (standard). Это расширение предоставляет следующие возможности и преимущества:

  • Создайте собственный код, создав функции, которые обладают гибкостью и контролем для решения наиболее сложных проблем интеграции.
  • Отладка кода локально в Visual Studio Code. Пошаговое выполнение кода и рабочих процессов в одном сеансе отладки.
  • Разверните код вместе с рабочими процессами. Другие планы обслуживания не нужны.
  • Поддержка сценариев миграции BizTalk Server, чтобы можно было перенести пользовательские инвестиции .NET из локальной среды в облако.

Благодаря возможности написания собственного кода можно выполнить такие сценарии, как:

  • Реализация пользовательской бизнес-логики
  • Пользовательский анализ для извлечения информации из входящего сообщения
  • Проверка данных и простые преобразования
  • Формирование сообщений для исходящих сообщений в другую систему, например API
  • Вычисления

Эта возможность не подходит для таких сценариев, как показано ниже.

  • Процессы, которые выполняются более 10 минут
  • Преобразования больших сообщений и данных
  • Сложные сценарии пакетного и расшифровки
  • Компоненты конвейера BizTalk Server, реализующие потоковую передачу

Дополнительные сведения об ограничениях в Azure Logic Apps см. в разделе "Ограничения и конфигурация" в Azure Logic Apps.

Необходимые компоненты

  • Учетная запись и подписка Azure. Если у вас нет ее, вы можете зарегистрироваться для получения бесплатной учетной записи Azure.

  • Последний Visual Studio Code с расширением Azure Logic Apps (standard). Чтобы удовлетворить эти требования, ознакомьтесь с предварительными требованиями для создания стандартных рабочих процессов в Azure Logic Apps с помощью Visual Studio Code.

    • В настоящее время возможности пользовательских функций доступны только в Visual Studio Code, работающей в операционной системе Windows.

    • В настоящее время возможности пользовательских функций поддерживают вызовы платформа .NET Framework и .NET 8 для рабочих процессов приложения логики, размещенных в Azure.

  • Локальная папка, используемая для создания проекта кода

Ограничения

В настоящее время разработка пользовательских функций недоступна в портал Azure. Однако после развертывания функций из Visual Studio Code в Azure выполните действия, описанные в статье "Вызов кода из рабочего процесса для портал Azure". Вы можете использовать встроенное действие с именем Вызова локальной функции в этом приложении логики, чтобы выбрать из развернутых пользовательских функций и запустить код. Последующие действия в рабочем процессе могут ссылаться на выходные данные этих функций, как и в любом другом рабочем процессе. Вы можете просмотреть журнал выполнения встроенного действия, входные и выходные данные.

Создание проекта кода

Последнее расширение Azure Logic Apps (standard) для Visual Studio Code включает шаблон проекта кода, который обеспечивает упрощенный интерфейс для написания, отладки и развертывания собственного кода с помощью рабочих процессов. Этот шаблон проекта создает файл рабочей области и два примера проектов: один проект для написания кода, другой проект для создания рабочих процессов.

Примечание.

Нельзя использовать одну и ту же папку проекта для кода и рабочих процессов.

  1. Откройте Visual Studio Code. На панели действий выберите значок Azure . (Клавиатура: SHIFT+ALT+A)

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

    Снимок экрана: Visual Studio Code, окно Azure, панель инструментов раздела рабочей области и выбранный параметр для создания рабочей области приложения логики.

  3. В поле "Выбор папки" перейдите к папке и выберите локальную папку, созданную для проекта.

  4. Когда появится окно запроса "Создать рабочую область приложения логики", укажите имя рабочей области:

    Снимок экрана: Visual Studio Code с запросом на ввод имени рабочей области.

    Этот пример продолжается с MyLogicAppWorkspace.

  5. Когда появится окно запроса "Выбор шаблона проекта для рабочей области приложения логики", выберите приложение логики с пользовательским проектом кода.

    Снимок экрана: Visual Studio Code с запросом на выбор шаблона проекта для рабочей области приложения логики.

  6. Для рабочих процессов приложения логики, размещенных в Azure, следуйте запросу, чтобы выбрать платформа .NET Framework или .NET 8.

  7. Следуйте последующим запросам, чтобы указать следующие примеры значений:

    Товар Пример значения
    Имя функции для проекта функций .NET WeatherForecast
    Имя пространства имен для проекта функций .NET Contoso.Enterprise
    Шаблон рабочего процесса:
    - Рабочий процесс с отслеживанием состояния
    - Рабочий процесс без отслеживания состояния
    Рабочий процесс с отслеживанием состояния
    Имя рабочего процесса MyWorkflow
  8. Выберите "Открыть" в текущем окне.

    После завершения этого шага Visual Studio Code создает рабочую область, которая включает проект функций .NET и проект приложения логики, например:

    Снимок экрана: Visual Studio Code с созданной рабочей областью.

    Узел Description
    <имя рабочей области> Содержит проект функций .NET и проект рабочего процесса приложения логики.
    Функции Содержит артефакты для проекта функций .NET. Например, <файл-имя> функции.cs — это файл кода, в котором можно создать код.
    Logic App Содержит артефакты для проекта приложения логики, включая пустой рабочий процесс.

Написание кода

  1. В рабочей области разверните узел "Функции ", если он еще не развернут.

  2. <Откройте файл function-name>.cs, который называется WeatherForecast.cs в этом примере.

    По умолчанию этот файл содержит пример кода, содержащий следующие элементы кода, а также приведенные ранее примеры значений, где это необходимо:

    • Имя пространства имен
    • Имя класса
    • Имя функции
    • Параметры функции
    • Возвращаемый тип
    • Сложный тип

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

    //------------------------------------------------------------
    // Copyright (c) Microsoft Corporation. All rights reserved.
    //------------------------------------------------------------
    
    namespace Contoso.Enterprise
    {
        using System;
        using System.Collections.Generic;
        using System.Threading.Tasks;
        using Microsoft.Azure.Functions.Extensions.Workflows;
        using Microsoft.Azure.WebJobs;
        using Microsoft.Extensions.Logging;
    
        /// <summary>
        /// Represents the WeatherForecast flow invoked function.
        /// </summary>
        public class WeatherForecast
        {
    
            private readonly ILogger<WeatherForecast> logger;
    
            public WeatherForecast(ILoggerFactory loggerFactory)
            {
                logger = loggerFactory.CreateLogger<WeatherForecast>();
            }
    
            /// <summary>
            /// Executes the logic app workflow.
            /// </summary>
            /// <param name="zipCode">The zip code.</param>
            /// <param name="temperatureScale">The temperature scale (e.g., Celsius or Fahrenheit).</param>
            [FunctionName("WeatherForecast")]
            public Task<Weather> Run([WorkflowActionTrigger] int zipCode, string temperatureScale)
            {
    
                this.logger.LogInformation("Starting WeatherForecast with Zip Code: " + zipCode + " and Scale: " + temperatureScale);
    
                // Generate random temperature within a range based on the temperature scale
                Random rnd = new Random();
                var currentTemp = temperatureScale == "Celsius" ? rnd.Next(1, 30) : rnd.Next(40, 90);
                var lowTemp = currentTemp - 10;
                var highTemp = currentTemp + 10;
    
                // Create a Weather object with the temperature information
                var weather = new Weather()
                {
                    ZipCode = zipCode,
                    CurrentWeather = $"The current weather is {currentTemp} {temperatureScale}",
                    DayLow = $"The low for the day is {lowTemp} {temperatureScale}",
                    DayHigh = $"The high for the day is {highTemp} {temperatureScale}"
                };
    
                return Task.FromResult(weather);
            }
    
            /// <summary>
            /// Represents the weather information for WeatherForecast.
            /// </summary>
            public class Weather
            {
                /// <summary>
                /// Gets or sets the zip code.
                /// </summary>
                public int ZipCode { get; set; }
    
                /// <summary>
                /// Gets or sets the current weather.
                /// </summary>
                public string CurrentWeather { get; set; }
    
                /// <summary>
                /// Gets or sets the low temperature for the day.
                /// </summary>
                public string DayLow { get; set; }
    
                /// <summary>
                /// Gets or sets the high temperature for the day.
                /// </summary>
                public string DayHigh { get; set; }
            }
        }
    }
    

    Определение функции включает метод по умолчанию Run , который можно использовать для начала работы. Этот пример Run метода демонстрирует некоторые возможности, доступные с помощью функции пользовательских функций, например передачу различных входных и выходных данных, включая сложные типы .NET.

    Файл <функции>.cs также включает ILogger интерфейс, который обеспечивает поддержку ведения журнала событий в ресурс Application Insights. Вы можете отправлять сведения трассировки в Application Insights и хранить эти сведения вместе с данными трассировки из рабочих процессов, например:

    private readonly ILogger<WeatherForecast> logger;
    
    public WeatherForecast(ILoggerFactory loggerFactory)
    {
        logger = loggerFactory.CreateLogger<WeatherForecast>();
    }
    
    [FunctionName("WeatherForecast")]
    public Task<Weather> Run([WorkflowActionTrigger] int zipCode, string temperatureScale)
    {
    
        this.logger.LogInformation("Starting WeatherForecast with Zip Code: " + zipCode + " and Scale: " + temperatureScale);
    
        <...>
    
    }
    
  3. Замените пример кода функции собственным и измените метод по умолчанию Run для собственных сценариев. Кроме того, можно скопировать функцию, включая [FunctionName("<*function-name*>")] объявление, а затем переименовать функцию с уникальным именем. Затем можно изменить переименованную функцию в соответствии с вашими потребностями.

Этот пример продолжается с примером кода без каких-либо изменений.

Компиляция и сборка кода

Завершив написание кода, выполните компиляцию, чтобы убедиться, что ошибки сборки отсутствуют. Проект функций .NET автоматически включает задачи сборки, которые компилируют и добавляют код в папку lib\custom в проекте приложения логики, где рабочие процессы ищут пользовательские функции для выполнения. Эти задачи помещают сборки в папку lib\custom\net472 или lib\custom\net8 на основе версии .NET.

  1. В Visual Studio Code в меню терминала выберите новый терминал.

  2. В появившемся списке рабочих каталогов выберите "Функции " в качестве текущего рабочего каталога для нового терминала.

    Снимок экрана: Visual Studio Code, запрос на текущий рабочий каталог и выбранный каталог Функций.

    Visual Studio Code открывает окно терминала с командной строкой.

  3. В окне терминала в командной строке введите dotnet restore.

    Visual Studio Code анализирует проекты и определяет, актуальны ли они.

    Снимок экрана: Visual Studio Code, окно терминала и завершенная команда восстановления dotnet.

  4. После повтора командной строки введите dotnet build. Или в меню терминала выберите команду "Выполнить задачу". В списке задач выберите сборку (Функции).

    Если сборка выполнена успешно, окно терминала сообщает, что сборка выполнена успешно.

  5. Убедитесь, что в проекте приложения логики существуют следующие элементы:

    • В рабочей области разверните следующие папки: LogicApp>lib\custom>net472 или net8 на основе версии .NET. Убедитесь, что вложенная папка с именем net472 или net8 соответственно содержит файлы сборки (DLL), необходимые для выполнения кода, включая имя> функции с именем <файла.dll.

    • В рабочей области разверните следующие папки: LogicApp>lib\custom<>function-name.> Убедитесь, что имя вложенной папки с именем <функции> содержит файл function.json, который содержит метаданные о написанном коде функции. Конструктор рабочих процессов использует этот файл для определения необходимых входных и выходных данных при вызове кода.

    В следующем примере показаны примеры созданных сборок и других файлов в проекте приложения логики:

    Снимок экрана: рабочая область Visual Studio Code и приложения логики с проектом функций .NET и проектом приложения логики, теперь с созданными сборками и другими необходимыми файлами.

Вызов кода из рабочего процесса

После подтверждения компиляции кода и того, что проект приложения логики содержит необходимые файлы для запуска кода, откройте рабочий процесс по умолчанию, включенный в проект приложения логики.

  1. В рабочей области в разделе LogicApp разверните <узел имени> рабочего процесса, откройте контекстное меню для workflow.json и выберите "Открыть конструктор".

    В открываемом конструкторе рабочих процессов рабочий процесс по умолчанию, включенный в проект приложения логики, отображается со следующим триггером и действиями:

  2. Выберите действие с именем "Вызвать локальную функцию" в этом приложении логики.

    Откроется область сведений действия справа.

    Снимок экрана: Visual Studio Code, конструктор рабочих процессов и рабочий процесс по умолчанию с триггером и действиями.

  3. Проверьте и убедитесь, что значение параметра "Имя функции" задано для функции, которую требуется запустить. Просмотрите или измените другие значения параметров, которые использует ваша функция.

Отладка кода и рабочего процесса

  1. Повторите следующие действия, чтобы запустить эмулятор хранилища Azurite три раза: каждый раз для следующих служба хранилища Azure служб:

    • Служба BLOB-объектов Azure
    • Служба очередей Azure
    • Служба таблиц Azure
    1. В меню представления Visual Studio Code выберите палитру команд.

    2. В появившемся запросе найдите и выберите Azurite: Запуск службы BLOB-объектов.

    3. В появившемся списке рабочих каталогов выберите LogicApp.

    4. Повторите следующие действия для Azurite: запуск службы очередей и Azurite: запуск службы таблиц.

    Если панель задач Visual Studio Code в нижней части экрана отображает три службы хранилища, запущенные, например:

    Снимок экрана: панель задач Visual Studio Code со службой BLOB-объектов Azure, службой очередей Azure и запущенной службой таблиц Azure.

  2. Подключите отладчик к проекту приложения логики, выполнив следующие действия:

    1. На панели действий Visual Studio Code выберите "Запуск и отладка". (Клавиатура: CTRL+SHIFT+D)

      Снимок экрана: панель действий Visual Studio Code с выбранным параметром

    2. В списке "Запуск и отладка " выберите "Присоединить к приложению логики" (LogicApp), если оно еще не выбрано, а затем нажмите кнопку "Воспроизвести " (зеленая стрелка).

      Снимок экрана: список запуска и отладки с выбранным приложением логики в приложении логики и кнопкой воспроизведения.

      Откроется окно терминала и отображается процесс отладки. Откроется окно консоли отладки и отображается состояние отладки. В нижней части Visual Studio Code панель задач становится оранжевым, указывая, что отладчик .NET загружается.

  3. Подключите отладчик к проекту функций .NET, выполнив следующие действия на основе кода:

    Проекты .NET 8

    1. В меню представления Visual Studio Code выберите палитру команд.

    2. В палитре команд найдите и выберите отладку: подключитесь к процессу .NET 5+ или .NET Core.

      Снимок экрана: список запуска и отладки с выбранным параметром

    3. В списке найдите и выберите процесс dotnet.exe . Если существуют несколько dotnet.exe процессов, выберите процесс, имеющий следующий путь:

      <>drive-name:\Users<user-name.azure-functions-core-tools>\Functions\ExtensionBundles\Microsoft.Azure.Functions.ExtensionBundle.Workflows<extension-bundle-version>\CustomCodeNetFxWorker\net8\Microsoft.Azure.Workflows.Functions.CustomCodeNetFxWorker.dll

    проекты платформа .NET Framework

    В списке "Запуск и отладка " выберите "Подключиться к функциям .NET (Функции)", если они еще не выбраны, а затем нажмите кнопку "Воспроизвести " (зеленая стрелка).

    Снимок экрана: список запуска и отладки с выбранным параметром

  4. Чтобы задать любые точки останова, в определении функции (имя> функции.cs) или определении рабочего процесса (<workflow.json), найдите номер строки, в котором требуется точка останова, и выберите столбец слева, например:

    Снимок экрана: Visual Studio Code и открытый файл кода функции с набором точек останова для строки в коде.

  5. Чтобы вручную запустить триггер запроса в рабочем процессе, откройте страницу обзора рабочего процесса.

    1. В проекте приложения логики откройте контекстное меню файла workflow.json и выберите "Обзор".

      На странице обзора рабочего процесса кнопка запуска триггера доступна, если вы хотите вручную запустить рабочий процесс. В разделе "Свойства рабочего процесса" значение URL-адреса обратного вызова — это URL-адрес вызываемой конечной точки, созданной триггером запроса в рабочем процессе. Вы можете отправлять запросы на этот URL-адрес, чтобы активировать рабочий процесс из других приложений, включая другие рабочие процессы приложения логики.

      Снимок экрана: открытая страница обзора Visual Studio Code и рабочего процесса.

  6. На панели инструментов "Обзор" выберите "Запустить триггер".

    После запуска рабочего процесса отладчик активирует первую точку останова.

  7. В меню "Запуск" или на панели инструментов отладчика выберите действие отладки.

    После завершения выполнения рабочего процесса на странице обзора отображаются завершенный запуск и основные сведения об этом выполнении.

  8. Чтобы просмотреть дополнительные сведения о выполнении рабочего процесса, выберите завершенный запуск. Или в списке рядом с столбцом "Длительность " выберите "Показать запуск".

    Снимок экрана: Visual Studio Code и завершенный рабочий процесс.

Развертывание кода

Пользовательские функции можно развертывать так же, как и в проекте приложения логики. Если вы развертываете из Visual Studio Code или используете процесс CI/CD DevOps, убедитесь, что вы создаете код и что все зависимые сборки существуют в следующей папке проекта приложения логики перед развертыванием:

  • .NET 4.7.2: папка lib/custom/net472

  • .NET 8: папка lib/custom/net8

Дополнительные сведения см. в статье "Развертывание стандартных рабочих процессов из Visual Studio Code в Azure".

Устранение неполадок

Ошибка области сведений о действии

При выборе встроенного действия с именем Вызова локальной функции в этом приложении логики в конструкторе рабочих процессов отображается следующее сообщение:

Failed to retrieve dynamic inputs. Error details:

В этом сценарии изучите проект приложения логики, чтобы проверить, пуста ли папка LogicApp\lib\custom . Если пусто, в меню терминала выберите "Запустить функции сборки задач>".

В настоящее время процесс с указанным именем не выполняется

Если при запуске рабочего процесса вы получите это сообщение об ошибке, скорее всего, у вас есть процесс отладчика, присоединенный к функциям .NET, а не к приложению логики.

Чтобы устранить эту проблему, в списке "Запуск и отладка " выберите "Подключиться к приложению логики" (LogicApp) и выберите "Воспроизвести " (зеленый треугольник).

Пакет не импортирован правильно

Если в окне вывода отображается ошибка, аналогичная приведенному ниже сообщению, убедитесь, что установлен по крайней мере .NET 6.0. Если у вас установлена эта версия, попробуйте удалить и переустановить ее.

C:\Users\yourUserName\.nuget\packages\microsoft.net.sdk.functions\4.2.0\build\Microsoft.NET.Sdk.Functions.targets(83,5): warning : The ExtensionsMetadataGenerator package was not imported correctly. Are you missing 'C:\Users\yourUserName\.nuget\packages\microsoft.azure.webjobs.script.extensionsmetadatagenerator\4.0.1\build\Microsoft.Azure.WebJobs.Script.ExtensionsMetadataGenerator.targets' or 'C:\Users\yourUserName\.nuget\packages\microsoft.azure.webjobs.script.extensionsmetadatagenerator\4.0.1\build\Microsoft.Azure.WebJobs.Script.ExtensionsMetadataGenerator.props'? [C:\Desktop\...\custom-code-project\MyLogicAppWorkspace\Function\WeatherForecast.csproj] WeatherForecast -> C:\Desktop\...\custom-code-project\MyLogicAppWorkspace\Function\\bin\Debug\net472\WeatherForecast.dll C:\Users\yourUserName\.nuget\packages\microsoft.net.sdk.functions\4.2.0\build\Microsoft.NET.Sdk.Functions.Build.targets(32,5): error : It was not possible to find any compatible framework version [C:\Desktop\...\custom-code-project\MyLogicAppWorkspace\Function\WeatherForecast.csproj] C:\Users\yourUserName\.nuget\packages\microsoft.net.sdk.functions\4.2.0\build\Microsoft.NET.Sdk.Functions.Build.targets(32,5): error : The specified framework 'Microsoft.NETCore.App', version '6.0.0' was not found. [C:\Desktop\...\custom-code-project\MyLogicAppWorkspace\Function\WeatherForecast.csproj] C:\Users\yourUserName\.nuget\packages\microsoft.net.sdk.functions\4.2.0\build\Microsoft.NET.Sdk.Functions.Build.targets(32,5): error : - Check application dependencies and target a framework version installed at: [C:\Desktop\...\custom-code-project\MyLogicAppWorkspace\Function\WeatherForecast.csproj]

Сбои сборки

Если функция не включает переменные и вы создаете код, окно вывода может отобразить следующие сообщения об ошибках:

C:\Users\yourUserName\...\custom-code-project\Function\func.cs (24,64): error CS1031: Type expected [C:\Users\yourUserName\...\custom-code-project\Function\func.csproj]
C:\Users\yourUserName\...\custom-code-project\Function\func.cs (24,64): error CS1001: Identifier expected [C:\Users\yourUserName\...\custom-code-project\Function\func.csproj]

Build FAILED.

C:\Users\yourUserName\...\custom-code-project\Function\func.cs (24,64): error CS1031: Type expected [C:\Users\yourUserName\...\custom-code-project\Function\func.csproj]
C:\Users\yourUserName\...\custom-code-project\Function\func.cs (24,64): error CS1001: Identifier expected [C:\Users\yourUserName\...\custom-code-project\Function\func.csproj]

0 Warning(s)
2 Error(s)

Чтобы устранить эту проблему, добавьте следующий параметр в методе кода Run :

string parameter1 = null

В следующем примере показано, как появляется сигнатура Run метода:

public static Task<Weather> Run([WorkflowActionTrigger] int zipCode, string temperatureScale, string parameter1 = null)

Следующие шаги

Создание стандартных рабочих процессов с помощью Visual Studio Code