Создание и запуск кода .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 включает шаблон проекта кода, который обеспечивает упрощенный интерфейс для написания, отладки и развертывания собственного кода с помощью рабочих процессов. Этот шаблон проекта создает файл рабочей области и два примера проектов: один проект для написания кода, другой проект для создания рабочих процессов.
Примечание.
Нельзя использовать одну и ту же папку проекта для кода и рабочих процессов.
Откройте Visual Studio Code. На панели действий выберите значок Azure . (Клавиатура: SHIFT+ALT+A)
В открывающемся окне Azure на панели инструментов раздела "Рабочая область" в меню Azure Logic Apps выберите "Создать рабочую область приложения логики".
В поле "Выбор папки" перейдите к папке и выберите локальную папку, созданную для проекта.
Когда появится окно запроса "Создать рабочую область приложения логики", укажите имя рабочей области:
Этот пример продолжается с MyLogicAppWorkspace.
Когда появится окно запроса "Выбор шаблона проекта для рабочей области приложения логики", выберите приложение логики с пользовательским проектом кода.
Для рабочих процессов приложения логики, размещенных в Azure, следуйте запросу, чтобы выбрать платформа .NET Framework или .NET 8.
Следуйте последующим запросам, чтобы указать следующие примеры значений:
Товар Пример значения Имя функции для проекта функций .NET WeatherForecast Имя пространства имен для проекта функций .NET Contoso.Enterprise Шаблон рабочего процесса:
- Рабочий процесс с отслеживанием состояния
- Рабочий процесс без отслеживания состоянияРабочий процесс с отслеживанием состояния Имя рабочего процесса MyWorkflow Выберите "Открыть" в текущем окне.
После завершения этого шага Visual Studio Code создает рабочую область, которая включает проект функций .NET и проект приложения логики, например:
Узел Description <имя рабочей области> Содержит проект функций .NET и проект рабочего процесса приложения логики. Функции Содержит артефакты для проекта функций .NET. Например, <файл-имя> функции.cs — это файл кода, в котором можно создать код. Logic App Содержит артефакты для проекта приложения логики, включая пустой рабочий процесс.
Написание кода
В рабочей области разверните узел "Функции ", если он еще не развернут.
<Откройте файл 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); <...> }
Замените пример кода функции собственным и измените метод по умолчанию
Run
для собственных сценариев. Кроме того, можно скопировать функцию, включая[FunctionName("<*function-name*>")]
объявление, а затем переименовать функцию с уникальным именем. Затем можно изменить переименованную функцию в соответствии с вашими потребностями.
Этот пример продолжается с примером кода без каких-либо изменений.
Компиляция и сборка кода
Завершив написание кода, выполните компиляцию, чтобы убедиться, что ошибки сборки отсутствуют. Проект функций .NET автоматически включает задачи сборки, которые компилируют и добавляют код в папку lib\custom в проекте приложения логики, где рабочие процессы ищут пользовательские функции для выполнения. Эти задачи помещают сборки в папку lib\custom\net472 или lib\custom\net8 на основе версии .NET.
В Visual Studio Code в меню терминала выберите новый терминал.
В появившемся списке рабочих каталогов выберите "Функции " в качестве текущего рабочего каталога для нового терминала.
Visual Studio Code открывает окно терминала с командной строкой.
В окне терминала в командной строке введите dotnet restore.
Visual Studio Code анализирует проекты и определяет, актуальны ли они.
После повтора командной строки введите dotnet build. Или в меню терминала выберите команду "Выполнить задачу". В списке задач выберите сборку (Функции).
Если сборка выполнена успешно, окно терминала сообщает, что сборка выполнена успешно.
Убедитесь, что в проекте приложения логики существуют следующие элементы:
В рабочей области разверните следующие папки: LogicApp>lib\custom>net472 или net8 на основе версии .NET. Убедитесь, что вложенная папка с именем net472 или net8 соответственно содержит файлы сборки (DLL), необходимые для выполнения кода, включая имя> функции с именем <файла.dll.
В рабочей области разверните следующие папки: LogicApp>lib\custom<>function-name.> Убедитесь, что имя вложенной папки с именем <функции> содержит файл function.json, который содержит метаданные о написанном коде функции. Конструктор рабочих процессов использует этот файл для определения необходимых входных и выходных данных при вызове кода.
В следующем примере показаны примеры созданных сборок и других файлов в проекте приложения логики:
Вызов кода из рабочего процесса
После подтверждения компиляции кода и того, что проект приложения логики содержит необходимые файлы для запуска кода, откройте рабочий процесс по умолчанию, включенный в проект приложения логики.
В рабочей области в разделе LogicApp разверните <узел имени> рабочего процесса, откройте контекстное меню для workflow.json и выберите "Открыть конструктор".
В открываемом конструкторе рабочих процессов рабочий процесс по умолчанию, включенный в проект приложения логики, отображается со следующим триггером и действиями:
- Встроенный триггер запроса с именем "При получении HTTP-запроса"
- Встроенное действие с именем Вызова локальной функции в этом приложении логики
- Встроенное действие ответа с именем Response, которое используется для ответа на вызывающий объект только при использовании триггера запроса.
Выберите действие с именем "Вызвать локальную функцию" в этом приложении логики.
Откроется область сведений действия справа.
Проверьте и убедитесь, что значение параметра "Имя функции" задано для функции, которую требуется запустить. Просмотрите или измените другие значения параметров, которые использует ваша функция.
Отладка кода и рабочего процесса
Повторите следующие действия, чтобы запустить эмулятор хранилища Azurite три раза: каждый раз для следующих служба хранилища Azure служб:
- Служба BLOB-объектов Azure
- Служба очередей Azure
- Служба таблиц Azure
В меню представления Visual Studio Code выберите палитру команд.
В появившемся запросе найдите и выберите Azurite: Запуск службы BLOB-объектов.
В появившемся списке рабочих каталогов выберите LogicApp.
Повторите следующие действия для Azurite: запуск службы очередей и Azurite: запуск службы таблиц.
Если панель задач Visual Studio Code в нижней части экрана отображает три службы хранилища, запущенные, например:
Подключите отладчик к проекту приложения логики, выполнив следующие действия:
На панели действий Visual Studio Code выберите "Запуск и отладка". (Клавиатура: CTRL+SHIFT+D)
В списке "Запуск и отладка " выберите "Присоединить к приложению логики" (LogicApp), если оно еще не выбрано, а затем нажмите кнопку "Воспроизвести " (зеленая стрелка).
Откроется окно терминала и отображается процесс отладки. Откроется окно консоли отладки и отображается состояние отладки. В нижней части Visual Studio Code панель задач становится оранжевым, указывая, что отладчик .NET загружается.
Подключите отладчик к проекту функций .NET, выполнив следующие действия на основе кода:
Проекты .NET 8
В меню представления Visual Studio Code выберите палитру команд.
В палитре команд найдите и выберите отладку: подключитесь к процессу .NET 5+ или .NET Core.
В списке найдите и выберите процесс 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 (Функции)", если они еще не выбраны, а затем нажмите кнопку "Воспроизвести " (зеленая стрелка).
Чтобы задать любые точки останова, в определении функции (имя> функции.cs) или определении рабочего процесса (<workflow.json), найдите номер строки, в котором требуется точка останова, и выберите столбец слева, например:
Чтобы вручную запустить триггер запроса в рабочем процессе, откройте страницу обзора рабочего процесса.
В проекте приложения логики откройте контекстное меню файла workflow.json и выберите "Обзор".
На странице обзора рабочего процесса кнопка запуска триггера доступна, если вы хотите вручную запустить рабочий процесс. В разделе "Свойства рабочего процесса" значение URL-адреса обратного вызова — это URL-адрес вызываемой конечной точки, созданной триггером запроса в рабочем процессе. Вы можете отправлять запросы на этот URL-адрес, чтобы активировать рабочий процесс из других приложений, включая другие рабочие процессы приложения логики.
На панели инструментов "Обзор" выберите "Запустить триггер".
После запуска рабочего процесса отладчик активирует первую точку останова.
В меню "Запуск" или на панели инструментов отладчика выберите действие отладки.
После завершения выполнения рабочего процесса на странице обзора отображаются завершенный запуск и основные сведения об этом выполнении.
Чтобы просмотреть дополнительные сведения о выполнении рабочего процесса, выберите завершенный запуск. Или в списке рядом с столбцом "Длительность " выберите "Показать запуск".
Развертывание кода
Пользовательские функции можно развертывать так же, как и в проекте приложения логики. Если вы развертываете из 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