如何使用 Azure .NET Core webapp 生成 Microsoft Teams 批准

How can I generate Microsoft Teams approvals using an Azure .NET Core webapp

我想将使用 MS Teams approvals 的 PowerAutomate 密集型工作流转换为 ASP.NET 核心应用程序。

有没有无需 PowerAutomate 即可创建批准的方法?

否,目前不使用 PowerAutomate 无法创建批准。

通过将所有逻辑转换为 .NET,我仍然能够使用 MS Teams 批准创建 .NET 应用程序,但必须创建单独的 PowerAutomate 工作流来生成批准。

我的基本流程是:

  1. .NET 将消息推送到 approval-requests Azure 队列,其中包含要在批准
  2. 中显示的信息
  3. PowerAutomate 工作流对 approval-requests 队列中的新消息有触发器,被触发
  4. PA 从队列中弹出消息,解析为 JSON
  5. PA 从 sharepoint/AAD 组收集人员列表,将电子邮件连接在一起
  6. PA 使用串联电子邮件列表启动并等待批准
  7. PA 将批准结果推送到 approval-responses 队列
  8. .NET 后台任务从 approval-responses 弹出消息并根据结果执行其应用程序逻辑。

This page 有助于开始使用 .NET 后台任务。但是,它提到 Timer class 不会等待上一次执行完成。相反,我只是使用一个新线程,它在无限循环中调用 Sleep,同时调用一个 Tick 方法来处理轮询和阻止工作流的执行,并获得肯定的批准结果。

using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;

namespace app.Services
{
    // https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-6.0&tabs=netcore-cli
    public class WorkflowFulfillmentService : IHostedService
    {
        private readonly ILogger<WorkflowFulfillmentService> _logger;
        private readonly WorkflowClient _workflowClient;
        private CancellationToken _cancellationToken;
        private Thread _thread;

        public WorkflowFulfillmentService(
            ILogger<WorkflowFulfillmentService> logger,
            WorkflowClient workflowClient
        )
        {
            _logger = logger;
            _workflowClient = workflowClient;
        }

        public Task StartAsync(CancellationToken cancellationToken)
        {
            _logger.LogInformation("Starting workflow fulfillment service.");
            _cancellationToken = cancellationToken;
            // _timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(5));
            _thread = new Thread(new ThreadStart(this.DoWork));
            _thread.Start();
            return Task.CompletedTask;
        }

        private async void DoWork()
        {
            while (true)
            {
                if (_cancellationToken.IsCancellationRequested)
                {
                    break;
                }
                else
                {
                    Thread.Sleep(5000);
                }
                await _workflowClient.Tick();
            }
        }


        public Task StopAsync(CancellationToken cancellationToken)
        {
            _logger.LogInformation("Stopping workflow fulfillment service.");
            return Task.CompletedTask;
        }
    }
}

然后在Startup.cs

            services.AddHostedService<WorkflowFulfillmentService>();