编写用于处理 Microsoft Dataverse 活动的 Azure Functions

已完成

上一个练习回顾了如何注册用于将 Microsoft Dataverse 数据发布到外部 Web API 的 Webhook。 在本练习中,您将使用 Azure Functions 生成一个示例 Web API,以说明如何使用已发布的 Webhook 活动。

Azure Functions 与插件

Microsoft Azure Functions 提供一种用于执行小工作单元的出色机制,类似于您在 Dataverse 中对其使用插件。 在许多情况下,将本逻辑卸载到单独的组件(例如 Azure Function)中,以减少 Dataverse 应用程序主机上的负荷,这可能很有意义。 您可以在同步容量中运行函数,因为 Dataverse Webhook 提供了给定请求的远程执行上下文。

但是,Azure Functions 未在 Dataverse 的活动管道中显式运行, 因此如果您需要以性能最优方式更新数据(例如在将字符串值发布到 Dataverse 之前,自动格式化该值),我们仍建议您使用插件执行此类操作。 从 Azure Function 执行的任何数据操作完成后,如果插件出现异常并回滚,该操作也不会回滚。

编写用于处理 Dataverse 活动的 Azure Functions

要开始编写用于处理 Dataverse 活动的 Azure Function,您将使用 Visual Studio 2022 的 Azure 开发模板创建和发布您的函数。 Visual Studio 提供许多可用于帮助简化 Azure 开发的工具。 因此,系统要求您在 Visual Studio 2022 实例中安装 Azure Development Tools。 如果您未安装该功能,可以通过 Visual Studio 安装程序添加它。

创建您的 Azure Function 项目

  1. 使用 Azure Functions 模板创建新的 Azure Function 项目。 您可以通过创建新项目,然后在搜索栏中输入“函数”来查找本模板。

  2. 为您的函数项目提供一个描述性名称,然后选择创建

  3. 选择最新 .NET Core LTSHttp 触发器,取消选中使用 Azurite 复选框,然后对授权级别选择函数,最后选择创建

    应立即创建您的示例项目,在函数的 .cs 文件中找到以下模板代码:

 public static class Function1
 {
     [FunctionName("Function1")]
     public static async Task<IActionResult> Run(
         [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
         ILogger log)
     {
         log.LogInformation("C# HTTP trigger function processed a request.");

         string name = req.Query["name"];

         string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
         dynamic data = JsonConvert.DeserializeObject(requestBody);
         name = name ?? data?.name;

         string responseMessage = string.IsNullOrEmpty(name)
             ? "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response."
             : $"Hello, {name}. This HTTP triggered function executed successfully.";

         return new OkObjectResult(responseMessage);
     }
 }

您稍后将替换本代码,但首先,将发布您的函数以确保一切正常工作。

将您的 Azure Function 发布到 Azure

  1. 右键单击您的项目,然后从上下文菜单中选择发布...,以测试将您的 Function 发布到 Azure 应用服务。

    右键单击项目和发布选项的屏幕截图。

  2. 选择 Azure,然后选择下一步

  3. 选择 Azure Function 应用(Windows),然后选择下一步

  4. 选择订阅,然后选择新建

  5. 为新的应用服务命名,选择资源组或创建新资源组,提供其他必需信息,然后选择创建

  6. 创建“发布配置文件”后,选择完成

  7. 选择发布,将函数部署到 Azure。 默认情况下,在发布模式下发布函数。 如果您要调试本函数(稍后详细介绍本内容),将需要在调试模式下发布函数。

创建 Azure Functions 的另一种方法

如果您想要在没有 Visual Studio 2019 帮助的情况下手动创建 Azure Function,可从 Azure 门户中执行此操作:

  1. 登录 Azure 环境,然后选择 + 创建新资源

  2. 搜索函数应用,然后选择函数应用

  3. 选择创建

  4. 要创建 Azure Function 应用,请指定其名称和运行时堆栈,然后验证订阅资源组区域字段是否正确,然后选择下一步

  5. 选择查看 + 创建

  6. 选择创建

注意

本课程不涵盖生成新 Azure Function 程序集的详细信息。

更新函数的逻辑以与 Dataverse 数据交互

  1. 如果需要,请将函数的 FunctionName 和相应的类名称更改为更有意义的内容(即 MSLearnFunction)。

  2. 将以下 using 语句添加到您的函数:

    using Newtonsoft.Json.Linq;
    
  3. 运行函数内的代码替换为以下代码:

    log.LogInformation("C# HTTP trigger function processed a request.");
    
     string queryParams = "";
     foreach (var q in req.Query)
     {
         queryParams += $"Key: {q.Key} Value: {q.Value}\n";
     }
    
     string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
     dynamic data = JsonConvert.DeserializeObject(requestBody);
     string requestHeader = "";
     foreach (var h in req.Headers)
     {
       requestHeader += $"Key: {h.Key} Value: {h.Value}\n";
     }
     log.LogInformation("Query Parameters:\n" + queryParams);
     log.LogInformation("Request Header: \n" + requestHeader);
     log.LogInformation("Request Body:\n" + requestBody);
     string requestBodyFormatted = JValue.Parse(requestBody).ToString(Formatting.Indented);
     log.LogInformation("Request Body Formatted:\n" + requestBodyFormatted);
    
     try
     {
       dynamic target = data.InputParameters["Target"];
    
       foreach (dynamic field in target.Attributes)
       {
         log.LogInformation($"Name: {field.Key} Value: { field.Value}");
       }
     }
     catch (Exception ex)
     {
       log.LogInformation(ex.ToString());
     }
    
     return (ActionResult)new OkObjectResult(data.InitiatingUserId);
    
  4. 生成您的函数,然后右键单击该项目,选择发布...,将其发布到 Azure

  5. 通过转到 Azure 门户来验证您的函数是否已发布。 您可以从在创建函数时指定的资源组中手动选择它, 也可以在 Azure 门户中按名称搜索它,如下图所示。

注册用于调用 Azure Function 的 Dataverse Webhook

在本练习中,您将使用 Plug-in Registration Tool,注册用于调用新 Azure Function 的 Webhook。

  1. 打开插件注册工具并登录到您的 Dataverse 环境。

  2. 通过在注册菜单选项下选择注册新 Web Hook 来注册新 Webhook。

    “注册”菜单下的“注册新 Web Hook”的屏幕截图。

  3. 通过选择获取函数 URL,从 Azure 门户中获取函数的 URL。

  4. 复制 URL

  5. 将复制的值粘贴到文本编辑器中,这看起来应如以下字符串所示。

    https://[AppServiceUrl].azurewebsites.net/api/MsLearnFunction?code=[WebhookKey]
    
  6. 从复制的 URL 中剪切代码查询字符串值并将其粘贴到 WebHook 注册字符串的部分中(确保删除 code= 部分)。 选择保存

  7. 注册一个新步骤,该步骤将发布有关创建新帐户的消息。 通过右键单击您的新 Webhook 程序集,然后选择注册新步骤来注册新步骤。

    “注册”下的“注册新步骤”值的屏幕截图。

  8. 为消息选择创建,为主要实体选择客户,为执行模式选择同步,然后选择注册新步骤按钮。 因为您将生产本 Webhook 以同步运行,因此请确保在您注册新步骤时设置该标志。

测试您的 Webhook 集成

  1. 要测试您的 Webhook 集成,请转到您的 Dataverse 环境并创建一个客户行。

  2. 转到 Azure 门户中的函数并查看日志。