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


Создание и запуск кода платформа .NET Framework из стандартных рабочих процессов в Azure Logic Apps

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

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

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

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

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

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

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

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

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

Ограничения

В настоящее время разработка пользовательских функций недоступна в портал 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 выберите "Создать рабочую область приложения логики".

    Screenshot shows Visual Studio Code, Azure window, Workspace section toolbar, and selected option for Create new logic app workspace.

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

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

    Screenshot shows Visual Studio Code with prompt to enter workspace name.

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

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

    Screenshot shows Visual Studio Code with prompt to select project template for logic app workspace.

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

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

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

    Screenshot shows Visual Studio Code with created workspace.

    Узел Description
    <имя рабочей области> Содержит проект функции и проект рабочего процесса приложения логики.
    Функции Содержит артефакты для проекта функции. Например, файл function-name.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.

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

    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*>")] объявление, а затем переименовать функцию с уникальным именем. Затем можно изменить переименованную функцию в соответствии с вашими потребностями.

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

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

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

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

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

    Screenshot shows Visual Studio Code, prompt for current working directory, and selected Functions directory.

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

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

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

    Screenshot shows Visual Studio Code, Terminal window, and completed dotnet restore command.

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

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

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

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

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

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

    Screenshot shows Visual Studio Code and logic app workspace with function project and logic app project, now with the generated assemblies and other required files.

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

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

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

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

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

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

    Screenshot shows Visual Studio Code, workflow designer, and default workflow with trigger and actions.

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

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

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

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

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

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

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

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

    Screenshot shows Visual Studio Code taskbar with Azure Blob Service, Azure Queue Service, and Azure Table Service running.

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

    Screenshot shows Visual Studio Code Activity Bar with Run and Debug selected.

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

    Screenshot shows Run and Debug list with Attach to logic app selected and Play button selected.

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

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

    Screenshot shows Run and Debug list with Attach to NET Functions selected and Play button selected.

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

    Screenshot shows Visual Studio Code and the open function code file with a breakpoint set for a line in code.

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

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

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

      Screenshot shows Visual Studio Code and workflow's Overview page opened.

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

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

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

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

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

    Screenshot shows Visual Studio Code and finished workflow run.

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

Пользовательские функции можно развертывать так же, как и в проекте приложения логики. Независимо от того, развертываете ли вы из Visual Studio Code или используете процесс CI/CD DevOps, убедитесь, что вы создаете код и что все зависимые сборки существуют в папке lib/custom/net472 проекта приложения логики перед развертыванием. Дополнительные сведения см. в статье "Развертывание стандартных рабочих процессов из 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