使用代码处理云端流

所有流都存储在 Dataverse 中,您可以使用适用于 .NET 的 Dataverse SDK 和 Web API 来管理它们。

本文介绍如何管理 Power Automate 的解决方案选项卡中包含的流。 目前,不支持使用代码管理我的流下的流。

与 Dataverse API 交互

Dataverse 使用适用于 .NET 的 Dataverse SDK 和 Web API 提供同等功能。

我应该使用哪个方法?

最佳方法取决于项目技术和您具有的技能。

如果您的项目使用 .NET,我们建议您使用 SDK。 SDK 通过提供类型化的对象模型和方法进行身份验证,简化您的开发体验。

详细信息:使用组织服务

如何连接?

如何连接取决于您使用的是适用于 .NET 的 Dataverse SDK 还是 Web API。

使用 SDK,您需要连接到客户端应用程序来访问 IOrganizationService 实例。 IOrganizationService 是一个提供可用于与 Dataverse 交互的方法的接口。

详细信息:

工作流表

云端流存储在流程(工作流)表中,该表在 Web API 中以工作流实体类型表示

下表介绍了工作流表中的重要列:

逻辑名称 类型​​ 说明
category 单选 流的类别。 这里是不同的类别。
0 - 经典 Dataverse 工作流。
1 - 经典 Dataverse 对话。
2 - 业务规则。
3 - 经典 Dataverse 操作。
4 - 业务流程流。
5 - 现代流(自动、即时或计划流)。
6 - 桌面流。
clientdata String 流定义及其 connectionReferences 的字符串编码的 JSON。
createdby 查找 创建流的用户。
createdon 日期/时间 创建流的日期。
description String 用户提供的流说明。
ismanaged Bool 指示流是否通过托管解决方案安装。
modifiedby 查找 更新流的最后一个用户。
modifiedon 日期/时间 上一次流更新的时间。
name String 您为流指定的显示名称。
ownerid 查找 负责流的用户或团队。
statecode 单选 流的状态。 状态可以是:
0 - 草稿(关)
1 - 已激活(开)
2 - 已挂起。
type 单选 指示流是正在运行的流,还是可用于创建更多流的模板。
1 - 定义,
2 - 激活
3 - 模板。
workflowid Guid 跨所有导入的云端流的唯一标识符。
workflowidunique Guid 此流安装的唯一标识符。

备注

使用 Web 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"]}");
}

要检索更多记录,删除 TopCount 限制。

输出

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

详细信息:

创建云端流

自动化、即时和计划流的必需属性有:categorynametypeprimaryentityclientdata。 为这些类型的流的 primaryentity 使用 none

此静态方法需要经过身份验证的客户端来实现 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);
}

详细信息:使用组织服务创建表行

以这种方式创建的所有流的 statecode 将设置为 0(草稿或“关”)。 流需要启用才能使用。

最重要的属性是 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 函数

详细信息:为主体提供访问记录的权限

共享或取消共享云端流

使用 GrantAccess 消息与任何其他 Dataverse 记录一样共享云端流。 使用 SDK 时,使用 GrantAccessRequest 类,使用 Web API 时,使用 GrantAccess 操作。 详细信息:GrantAccess 示例

如果您想要更改共享记录时授予的访问权限,使用 ModifyAccess 消息。 使用 SDK 时,使用 ModifyAccessRequest 类,使用 Web API 时,使用 ModifyAccess 操作。 详细信息:ModifyAccess 示例

要取消共享记录,使用 RevokeAccess 消息。 使用 SDK 时,使用 RevokeAccessRequest 类,使用 Web API 时,使用 RevokeAccess 操作。 详细信息:撤消访问权限

导出流

当流是解决方案的一部分时,您可以通过使用 ExportSolution 消息导出包含流的解决方案来导出流。

下面的静态 ExportSolution 示例方法使用 ExportSolutionRequest 检索包含指定 UniqueName 的非托管解决方案的 ZIP 文件的 byte[]

/// <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 包含解决方案的 base 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.flow.microsoft.com 的 API 怎么样?

不支持 api.flow.microsoft.com 的 API。 客户应该使用本文前面提到的 Power Automate 的 Dataverse Web API。

或者,客户可以使用管理连接器:Power Automate 管理用于管理员的 Power Automate

客户可以使用不受支持的 API,但 api.flow.microsoft.com 需要自行承担风险。 这些 API 可能会发生变更,因此可能会发生突破性的变更。

使用组织服务的实体类操作
使用 Web API 执行操作
共享和分配
使用代码验证访问权限
使用 Dataverse SDK 处理解决方案