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


Создание проекта ядра правил Azure Logic Apps с помощью Visual Studio Code (предварительная версия)

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

Внимание

Эта возможность входит в предварительную версию, и на нее распространяются Дополнительные условия использования предварительных версий Microsoft Azure.

Если вы хотите интегрировать бизнес-логику со стандартными рабочими процессами в Azure Logic Apps, можно создать и создать проект обработчика правил Azure Logic Apps с помощью Visual Studio Code. Правила управляют бизнес-логикой для работы бизнес-процессов.

В этом руководстве описано, как создать проект обработчика правил Azure Logic Apps:

  • Предварительные требования и настройка для создания проекта подсистемы правил Azure Logic Apps, включая создание бизнес-правил для проекта с помощью Microsoft Rules Composer.

  • Экспортируйте существующие правила из Microsoft BizTalk Server, если у вас есть.

  • Создайте проект приложений логики уровня "Стандартный" для обработчика правил Azure Logic Apps с помощью Visual Studio Code.

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

Перед созданием проекта

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

  1. Определите, как бизнес-правила соответствуют бизнес-процессам.

  2. Планирование внедрения бизнес-правил в приложение.

  3. Определите бизнес-логику, которую вы хотите представить с помощью правил в приложении.

    Термин "бизнес-логика" может ссылаться на многие вещи. Например, бизнес-логика может быть "Заказы на покупку, превышающие 500 долларов, требуют утверждения руководителя".

  4. Определите источники данных для элементов правила. При необходимости можно определить словари, которые представляют базовые привязки для конкретного домена.

  5. Определите правила для использования из определений словаря или непосредственно из привязок данных. Из этих правил создайте набор правил, представляющий бизнес-логику.

Экспорт правил из Microsoft BizTalk Server

Чтобы повторно использовать существующие правила из Microsoft BizTalk Server, их можно экспортировать. Однако факты базы данных в настоящее время не поддерживаются. Перед экспортом правил удалите или рефакторинг их в другие типы фактов с помощью Microsoft BizTalk Rules Composer.

  1. На сервере Microsoft BizTalk Server запустите мастер развертывания подсистемы бизнес-правил.

  2. На странице мастера развертывания обработчика правил нажмите кнопку "Далее".

  3. На странице "Задача развертывания" выберите "Экспорт политики или словаря в файл" из базы данных и нажмите кнопку "Далее".

  4. На странице "Хранилище политик" в списке имен SQL Server выберите сервер SQL Server. В списке серверов базы данных конфигурации выберите BizTalkRuleEngineDb и нажмите кнопку "Далее".

  5. На странице экспорта политики или словаря в списке политик выберите нужную политику. Чтобы найти и выбрать файл определения, нажмите кнопку "Обзор".

  6. Затем нажмите кнопку Далее.

  7. Подтвердите сведения о сервере, базе данных и политике или словаре и нажмите кнопку "Далее".

  8. После завершения импорта или экспорта нажмите кнопку "Далее".

  9. Просмотрите состояние завершения импорта или экспорта и нажмите кнопку "Готово".

Создание проекта ядра правил Azure Logic Apps

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Написание кода обработчика правил

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

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

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

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

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

    //------------------------------------------------------------
    // 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.Azure.Workflows.RuleEngine;
        using Microsoft.Extensions.Logging;
        using System.Xml;
    
        /// <summary>
        /// Represents the RulesFunction flow invoked function.
        /// </summary>
        public class RulesFunction
        {
            private readonly ILogger<RulesFunction> logger;
    
            public RulesFunction(ILoggerFactory loggerFactory)
            {
                logger = loggerFactory.CreateLogger<RulesFunction>();
            }
    
            /// <summary>
            /// Execute the logic app workflow.
            /// </summary>
            /// <param name="ruleSetName">The ruleset name.</param>
            /// <param name="documentType">The document type for the input XML.</param>
            /// <param name="inputXml">The input XML type fact.</param>
            /// <param name="purchaseAmount">The purchase amount value used to create a .NET fact.</param>
            /// <param name="zipCode">The zip code value used to create a .NET fact.</param>
            [FunctionName("RulesFunction")]
            public Task<RuleExecutionResult> RunRules([WorkflowActionTrigger] string ruleSetName, string documentType, string inputXml, int purchaseAmount, string zipCode)
            {
                /***** Summary of steps below *****
                * 1. Get the ruleset to execute.
                * 2. Check if the ruleset was successfully retrieved.
                * 3. Create the rules engine object.
                * 4. Create TypedXmlDocument facts for all XML document facts.
                * 5. Initialize .NET facts.
                * 6. Execute rules engine.
                * 7. Retrieve relevant updates facts and send them back.
                */
    
                try
                {
                    // Get the ruleset based on the ruleset name.
                     var ruleExplorer = new FileStoreRuleExplorer();
                     var ruleSet = ruleExplorer.GetRuleSet(ruleSetName);
    
                    // Check if ruleset exists.
                    if(ruleSet == null)
                    {
                        // Log an error if ruleset not found.
                        this.logger.LogCritical($"RuleSet instance for '{ruleSetName}' was not found(null)");
                        throw new Exception($"RuleSet instance for '{ruleSetName}' was not found.");
                    }
    
                    // Create rules engine instance.
                    var ruleEngine = new RuleEngine(ruleSet: ruleSet);
    
                    // Create one or more typedXmlDcoument facts from one or more input XML documents.
                    XmlDocument doc = new XmlDocument();
                    doc.LoadXml(inputXml);
                    var typedXmlDocument = new TypedXmlDocument(documentType, doc);
    
                    // Initialize .NET facts.
                    var currentPurchase = new ContosoNamespace.ContosoPurchase(purchaseAmount, zipCode);
    
                    // Provide facts and run the rules engine.
                    ruleEngine.Execute(new object[] { typedXmlDocument, currentPurchase });
    
                    // Send back the relevant results (facts).
                    var updatedDoc = typedXmlDocument.Document as XmlDocument;
                    var ruleExectionOutput = new RuleExecutionResult()
                    {
                        XmlDoc = updatedDoc.OuterXml,
                        PurchaseAmountPostTax = currentPurchase.PurchaseAmount + currentPurchase.GetSalesTax()
                    };
    
                    return Task.FromResult(ruleExectionOutput);
                }
                catch(RuleEngineException ruleEngineException)
                {
                    // Log any rules engine exceptions.
                    this.logger.LogCritical(ruleEngineException.ToString());
                    throw;
                }
            }
    
            /// <summary>
            /// Results from rules execution
            /// </summary>
            public class RuleExecutionResult
            {
                /// <summary>
                /// Rules updated XML document
                /// </summary>
                public string XmlDoc { get; set;}
    
                /// <summary>
                /// Purchase amount after tax
                /// </summary>
                public int PurchaseAmountPostTax { get; set;}
            }
        }
    }
    

    Определение функции включает RulesFunction метод по умолчанию RunRules , который можно использовать для начала работы. В этом примере метода RunRules показано, как передать параметры в обработчик правил Azure Logic Apps. В этом примере метод передает имя набора правил, тип входного документа, факт XML и другие значения для дальнейшей обработки.

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

    private readonly ILogger<RulesFunction> logger;
    
        public RulesFunction(ILoggerFactory loggerFactory)
        {
            logger = loggerFactory.CreateLogger<RulesFunction>();
        }
        <...>
    
    

    Обработчик правил Azure Logic Apps работает, как описано в следующих шагах:

    1. Модуль использует FileStoreRuleExplorer объект для доступа к набору правил. Файл набора правил хранится в каталоге правил для приложения логики "Стандартный".

      В этом примере вызывается SampleRuleSet.xmlфайл набора правил, созданный с помощью microsoft Rules Composer или экспортированного с помощью Microsoft BizTalk Server.

      var ruleExplorer = new FileStoreRuleExplorer();
      var ruleSet = ruleExplorer.GetRuleSet(ruleSetName);
      
      // Check if the ruleset exists.
      if(ruleSet == null)
      {
          // Log an error if the ruleset isn't found.
          this.logger.LogCritical($"RuleSet instance for '{ruleSetName}' was not found(null)");
          throw new Exception($"RuleSet instance for '{ruleSetName}' was not found.");
      }
      

      Внимание

      Наборы правил содержат ссылки на их факты. Microsoft Rules Composer ищет сборки фактов для проверки набора правил для редактирования. Чтобы открыть наборы правил, например SampleRuleSet.xml в Microsoft Rules Composer, необходимо разместить их с соответствующими сборками фактов .NET. В противном случае вы получите исключение.

    2. Модуль использует ruleSet объект для создания экземпляра RuleEngine объекта.

    3. Объект RuleEngine получает факты правила с помощью Execute метода.

      В этом примере Execute метод получает два факта: XML-факт с именем typedXmlDocument и фактом .NET.currentPurchase

      После запуска подсистемы значения фактов перезаписываются со значениями, которые приводят к выполнению подсистемы:

      // Create rules engine instance.
      var ruleEngine = new RuleEngine(ruleSet: ruleSet);
      
      // Create one or more typedXml facts from one or more input XML documents.
      XmlDocument doc = new XmlDocument();
      doc.LoadXml(inputXml);
      var typedXmlDocument = new TypedXmlDocument(documentType, doc);
      
      // Initialize .NET facts.
      var currentPurchase = new ContosoNamespace.ContosoPurchase(purchaseAmount, zipCode);
      
      // Provide facts and run the rules engine.
      ruleEngine.Execute(new object[] { typedXmlDocument, currentPurchase });
      
      // Send back the relevant results (facts).
      var updatedDoc = typedXmlDocument.Document as XmlDocument;
      
    4. Подсистема RuleExecutionResult использует пользовательский класс для возврата значений в RunRules метод:

      var ruleExectionOutput = new RuleExecutionResult()
      {
          XmlDoc = updatedDoc.OuterXml,
          PurchaseAmountPostTax = currentPurchase.PurchaseAmount + currentPurchase.GetSalesTax()
      };
      
      return Task.FromResult(ruleExectionOutput);
      
    5. Замените пример кода функции собственным и измените метод по умолчанию RunRules для собственных сценариев.

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

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

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

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

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

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

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

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

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

  4. После повторного применения командной строки введите dotnet build .\RulesFunction.csproj.

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

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

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

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

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

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

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

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

  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. На панели действий Visual Studio Code выберите "Запуск и отладка". (Клавиатура: CTRL+SHIFT+D)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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