Работа с потоци за облак посредством код

Всички потоци се съхраняват в Dataverse и можете да използвате или Dataverse SDK за .NET, или Web API, за да ги управлявате.

Тази статия обхваща управлението на потоци, включени в раздела „Решения“ в . Power Automate В момента управлението на потоци в Моите потоци не се поддържа с код.

Взаимодействие с API Dataverse

Dataverse предоставя еквивалентни възможности, използвайки или SDK за .NET, или Web API. Dataverse

Кой метод трябва да използвам?

Най-добрият метод зависи от технологията на проекта и уменията, които притежавате.

Ако вашият проект използва .NET, препоръчваме да използвате SDK. SDK опростява процеса на разработка, като предоставя типизиран обектен модел и методи за удостоверяване.

Повече информация: Използвайте услугата „Организация“

Как да се свържа?

Как да се свържете зависи от това дали използвате SDK за .NET или Web API. Dataverse

С SDK трябва да се свържете с клиентско приложение, за да получите достъп до екземпляр на IOrganizationService. ... IOrganizationService е интерфейс, който предоставя методи, които можете да използвате за взаимодействие с Dataverse.

Допълнителна информация:

Таблица на работния процес

Потоците в облака се съхраняват в таблицата Процес (Работен поток) , която е представена в уеб API като тип на обекта на работния поток

Следната таблица описва важните колони в таблицата на работния процес:

Логическо име Тип Описание
category Възможност за избор Категорията на потока. Ето различните категории.
0 - Класически работни процеси. Dataverse
1 - Класически диалози. Dataverse
2 - Правила за бизнеса.
3 - Класически действия. Dataverse
4 - Потоци на бизнес процесите.
5 - Modern Flow (автоматизирани, незабавни или планирани потоци).
6 - Потоци на работния плот.
clientdata String JSON файл, кодиран като низ, на дефиницията на потока и неговите connectionReferences.
createdby Справка Потребителят, който е създал потока.
createdon ДатаЧас Датата, на която е създаден потокът.
description String Описанието на потока, предоставено от потребителя.
ismanaged Булева Показва дали потокът е инсталиран чрез управлявано решение.
modifiedby Справка Последният потребител, който е актуализирал потока.
modifiedon ДатаЧас Последният път, когато потокът беше актуализиран.
name String Показваното име, което сте дали на потока.
ownerid Справка Потребителят или екипът, който притежава потока.
statecode Възможност за избор Състоянието на потока. Състоянието може да бъде:
0 - Чернова (Изключено)
1 - Активирано (Вкл.)
2 - Спрено.
type Възможност за избор Показва дали потокът е работещ поток или шаблон, който може да се използва за създаване на още потоци.
1 - Определение,
2 - Активиране
3 - Шаблон.
workflowid GUID Уникалният идентификатор за облачен поток във всички импортирания.
workflowidunique GUID Уникалният идентификатор за тази инсталация на потока.

Бележка

С уеб API, стойностите за търсене са свойства за навигация с една стойност което може да се разшири, за да се получат подробности от свързания запис.

Колоните за търсене също имат съответния GUID свойства за търсене които могат да се използват в заявки. Свойствата за търсене имат следната конвенция за именуване: _<logical name>_value. За типа обект на работния процес в Web API можете да използвате следните свойства за търсене: _createdby_value, _modifiedby_value и _ownerid_value.

Изброяване на потоци

За да извлечете списък с облачни потоци, можете да направите заявка към таблицата на работния поток. Следната заявка връща първия автоматизиран, незабавен или планиран поток, който е „включен“ в момента:

Това статично OutputFirstActiveFlow методът изисква удостоверен клиент, който реализира IOrganizationService. Той използва IOrganizationService.RetrieveMultiple метод.

/// <summary>
/// Outputs the first active flow
/// </summary>
/// <param name="service">Authenticated client implementing the IOrganizationService interface</param>
public static void OutputFirstActiveFlow(IOrganizationService service)
{
   var query = new QueryExpression("workflow")
   {
         ColumnSet = new ColumnSet("category",
                                    "createdby",
                                    "createdon",
                                    "description",
                                    "ismanaged",
                                    "modifiedby",
                                    "modifiedon",
                                    "name",
                                    "ownerid",
                                    "statecode",
                                    "type",
                                    "workflowid",
                                    "workflowidunique"),
         Criteria = new FilterExpression(LogicalOperator.And)
         {
            Conditions = {
            {  new ConditionExpression(
               "category",
                     ConditionOperator.Equal,
                     5) }, // Cloud Flow
            {  new ConditionExpression(
                     "statecode",
                     ConditionOperator.Equal,
                     1) } // Active
         }
         },
         TopCount = 1 // Limit to one record
   };

   EntityCollection workflows = service.RetrieveMultiple(query);

   Entity workflow = workflows.Entities.FirstOrDefault();

   Console.WriteLine($"category: {workflow.FormattedValues["category"]}");
   Console.WriteLine($"createdby: {workflow.FormattedValues["createdby"]}");
   Console.WriteLine($"createdon: {workflow.FormattedValues["createdon"]}");
   // Description may be null
   Console.WriteLine($"description: {workflow.GetAttributeValue<string>("description")}");
   Console.WriteLine($"ismanaged: {workflow.FormattedValues["ismanaged"]}");
   Console.WriteLine($"modifiedby: {workflow.FormattedValues["modifiedby"]}");
   Console.WriteLine($"modifiedon: {workflow.FormattedValues["modifiedon"]}");
   Console.WriteLine($"name: {workflow["name"]}");
   Console.WriteLine($"ownerid: {workflow.FormattedValues["ownerid"]}");
   Console.WriteLine($"statecode: {workflow.FormattedValues["statecode"]}");
   Console.WriteLine($"type: {workflow.FormattedValues["type"]}");
   Console.WriteLine($"workflowid: {workflow["workflowid"]}");
   Console.WriteLine($"workflowidunique: {workflow["workflowidunique"]}");
}

За да извлечете още записи, премахнете ТопКонт лимит.

Изход

category: Modern Flow
createdby: SYSTEM
createdon: 5/20/2020 9:37 PM
description:
ismanaged: Unmanaged
modifiedby: Kiana Anderson
modifiedon: 5/6/2023 3:37 AM
name: When an account is updated -> Create a new record
ownerid: Monica Thomson
statecode: Activated
type: Definition
workflowid: d9e875bf-1c9b-ea11-a811-000d3a122b89
workflowidunique: c17af45c-10a1-43ca-b816-d9cc352718cf

Допълнителна информация:

Създаване на поток за облак

Необходимите свойства за автоматизирани, незабавни и планирани потоци са: category, name, type, primaryentity и clientdata. Използвайте none за primaryentity за тези видове потоци.

Този статичен метод изисква удостоверен клиент, който имплементира IOrganizationService. Той използва IOrganizationService.Create метод.

/// <summary>
/// Creates a cloud flow
/// </summary>
/// <param name="service">Authenticated client implementing the IOrganizationService interface</param>
/// <returns>The workflowid</returns>
public static Guid CreateCloudFlow(IOrganizationService service)
{
   var workflow = new Entity("workflow")
   {
         Attributes = {
            {"category", new OptionSetValue(5) }, // Cloud flow
            {"name", "Sample flow name"},
            {"type", new OptionSetValue(1) }, //Definition
            {"description", "This flow reads some data from Dataverse." },
            {"primaryentity", "none" },
            {"clientdata", "{\"properties\":{\"connectionReferences\":{\"shared_commondataserviceforapps\":{\"impersonation\":{},\"runtimeSource\":\"embedded\",\"connection\":{\"name\":\"shared-commondataser-114efb88-a991-40c7-b75f-2693-b1ca6a0c\",\"connectionReferenceLogicalName\":\"crdcb_sharedcommondataserviceforapps_109ea\"},\"api\":{\"name\":\"shared_commondataserviceforapps\"}}},\"definition\":{\"$schema\":\"https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#\",\"contentVersion\":\"1.0.0.0\",\"parameters\":{\"$connections\":{\"defaultValue\":{},\"type\":\"Object\"},\"$authentication\":{\"defaultValue\":{},\"type\":\"SecureObject\"}},\"triggers\":{\"manual\":{\"metadata\":{\"operationMetadataId\":\"76f87a86-89b3-48b4-92a2-1b74539894a6\"},\"type\":\"Request\",\"kind\":\"Button\",\"inputs\":{\"schema\":{\"type\":\"object\",\"properties\":{},\"required\":[]}}}},\"actions\":{\"List_rows\":{\"runAfter\":{},\"metadata\":{\"operationMetadataId\":\"9725b30f-4a8e-4695-b6fd-9a4985808809\"},\"type\":\"OpenApiConnection\",\"inputs\":{\"host\":{\"apiId\":\"/providers/Microsoft.PowerApps/apis/shared_commondataserviceforapps\",\"connectionName\":\"shared_commondataserviceforapps\",\"operationId\":\"ListRecords\"},\"parameters\":{\"entityName\":\"accounts\",\"$select\":\"name\",\"$top\":1},\"authentication\":\"@parameters('$authentication')\"}}}}},\"schemaVersion\":\"1.0.0.0\"}" }
         }
   };

   return service.Create(workflow);
}

Повече информация: Създаване на редове в таблицата с помощта на услугата за организация

Всички потоци, създадени по този начин, са зададени на „Чернова“ или „Изключено“. statecode0 Потокът трябва да бъде активиран, преди да може да се използва.

Най-важното свойство е ** clientdata**, което съдържа **това, което потокът използва**, и **дефиницията** на потока. connectionReferences... connectionReferences са съпоставянията към всяка връзка, която потокът използва.

{
  "properties": {
    "connectionReferences": {
      "shared_commondataserviceforapps": {
        "runtimeSource": "embedded",
        "connection": {},
        "api": { 
         "name": "shared_commondataserviceforapps" 
         }
      }
    },
    "definition": {
      "$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "$connections": { "defaultValue": {}, "type": "Object" },
        "$authentication": { "defaultValue": {}, "type": "SecureObject" }
      },
      "triggers": {
        "manual": {
          "metadata": {},
          "type": "Request",
          "kind": "Button",
          "inputs": {
            "schema": { "type": "object", "properties": {}, "required": [] }
          }
        }
      },
      "actions": {
        "List_rows": {
          "runAfter": {},
          "metadata": {},
          "type": "OpenApiConnection",
          "inputs": {
            "host": {
              "apiId": "/providers/Microsoft.PowerApps/apis/shared_commondataserviceforapps",
              "connectionName": "shared_commondataserviceforapps",
              "operationId": "ListRecords"
            },
            "parameters": {
              "entityName": "accounts",
              "$select": "name",
              "$top": 1
            },
            "authentication": "@parameters('$authentication')"
          }
        }
      }
    }
  },
  "schemaVersion": "1.0.0.0"
}

Актуализиране на поток в облака

За да актуализирате поток, задайте само свойствата, които искате да промените.

Този статичен метод изисква удостоверен клиент, който имплементира IOrganizationService. Той използва метода IOrganizationService.Update , за да актуализира описанието на потока и да зададе собственика.

/// <summary>
/// Updates a cloud flow
/// </summary>
/// <param name="service">Authenticated client implementing the IOrganizationService interface</param>
/// <param name="workflowid">The ID of the flow to update.</param>
/// <param name="systemuserid">The id of the user to assign the flow to.</param>
public static void UpdateCloudFlow(IOrganizationService service, Guid workflowid, Guid systemuserid) {

   var workflow = new Entity("workflow",workflowid)
   {
         Attributes = {

            {"description", "This flow will ensure consistency across systems." },
            {"ownerid", new EntityReference("systemuser",systemuserid)},
            {"statecode", new OptionSetValue(1) } //Turn on the flow.
         }
   };

   service.Update(workflow);
}

Повече информация: Актуализиране и изтриване на редове от таблицата с помощта на услугата за организация > Основна актуализация

Изтриване на поток в облака

Следните примери показват как да изтриете записа на работния поток, който представлява облачен поток.

Статичният метод изтрива запис на работен поток. DeleteCloudFlow

/// <summary>
/// Deletes a workflow
/// </summary>
/// <param name="service">Authenticated client implementing the IOrganizationService interface</param>
/// <param name="workflowId">The id of the cloud flow to delete.</param>
public static void DeleteCloudFlow(IOrganizationService service, Guid workflowId) { 

service.Delete(entityName:"workflow",id: workflowId);

}

Повече информация: Изтриване на запис с помощта на SDK

Получаване на всички потребители, с които е споделен облачен поток

Използвайте съобщението RetrieveSharedPrincipalsAndAccess , за да получите списък с всички потребители, с които е споделен даден поток в облака.

С SDK използвайте класа RetrieveSharedPrincipalsAndAccessRequest, а с Web API използвайте функцията RetrieveSharedPrincipalsAndAccess.

Повече информация: Получаване на достъп до запис от принципали

Споделяне или премахване на споделянето на поток в облака

Споделете облачен поток като всеки друг Dataverse запис, използвайки GrantAccess съобщението. С SDK използвайте класа GrantAccessRequest, а с Web API използвайте действието GrantAccess. ...... Повече информация: Пример за GrantAccess

Ако искате да промените правата за достъп, които предоставяте, когато споделяте запис, използвайте съобщението ModifyAccess . С SDK използвайте класа ModifyAccessRequest, а с уеб API използвайте действието ModifyAccess. Повече информация: Пример за ModifyAccess

За да прекратите споделянето на запис, използвайте съобщението RevokeAccess . С SDK използвайте класа RevokeAccessRequest, а с уеб API използвайте действието RevokeAccess. Повече информация: Отмяна на достъпа

Експортни потоци

Когато потокът е част от решение, можете да го експортирате, като експортирате решението, което съдържа потока, като използвате ExportSolution съобщението.

Следният статичен ExportSolution примерен метод използва ExportSolutionRequest за извличане на byte[] съдържащ ZIP файла на незавършеното решение с указаното UniqueName.

/// <summary>
/// Exports an unmanaged solution
/// </summary>
/// <param name="service">Authenticated client implementing the IOrganizationService interface</param>
/// <param name="solutionUniqueName">The uniquename of the solution.</param>
/// <returns></returns>
public static byte[] ExportSolution(
   IOrganizationService service, 
   string solutionUniqueName) 
{
   ExportSolutionRequest request = new() { 
         SolutionName = solutionUniqueName,
         Managed = false
   };

   var response = (ExportSolutionResponse)service.Execute(request);

   return response.ExportSolutionFile;
}

Потоци на внос

Когато имате ZIP файл на решение, можете да го импортирате с помощта на ImportSolution съобщението.

Когато импортирате потоци, трябва да зададете следните параметри:

Име на свойството Описание
OverwriteUnmanagedCustomizations Ако има съществуващи екземпляри на тези потоци Dataverse, този флаг трябва да бъде зададен на true , за да ги импортира. В противен случай те не се презаписват.
PublishWorkflows Показва дали класическите Dataverse работни потоци са активирани при импортиране. Тази настройка не се прилага за други типове потоци.
CustomizationFile Базов 64-кодиран zip файл, който съдържа решението.

Статичният ImportSolution примерен метод показва как да импортирате файл с решение с помощта на класа ImportSolutionRequest

/// <summary>
/// Imports a solution.
/// </summary>
/// <param name="service">Authenticated client implementing the IOrganizationService interface</param>
/// <param name="solutionFile">The byte[] data representing a solution file. </param>
public static void ImportSolution(
   IOrganizationService service, 
   byte[] solutionFile) {

   ImportSolutionRequest request = new() { 
         OverwriteUnmanagedCustomizations = true,
         CustomizationFile = solutionFile
   };

   service.Execute(request);
}

ЧЗВ

Какво ще кажете за API на api.flow.microsoft.com?

API at api.flow.microsoft.com не се поддържа. Вместо това клиентите трябва да използват Dataverse уеб API, документирани Power Automate по-рано в тази статия.

Като алтернатива клиентите могат да използват конекторите за управление: Power Automate Управление или Power Automate за администратори.

Клиентите могат да използват неподдържаните API на api.flow.microsoft.com свой собствен риск. Тези API подлежат на промяна, така че може да възникнат прекъсващи промени.

Операции с клас обект, използващи услугата "Организация"
Извършване на операции с помощта на уеб API
Споделяне и възлагане
Проверка на достъпа в код
Работа с решения с помощта на Dataverse SDK