【发布时间】:2021-05-16 17:28:05
【问题描述】:
我有一个 Orchestrator 功能如下:
[FunctionName("O_OrchestratorFunction)]
public async Task<object> Process(
[OrchestrationTrigger] IDurableOrchestrationContext context,
ILogger log)
{
await context.CallActivityAsync("A_SendApprovalRequestEmail", "email");
var _approvalResult = await context.WaitForExternalEvent<string>("ApprovalResult");
if (_approvalResult == "Approved")
{
await context.CallActivityAsync("A_ResumeJobSync", "email");
}
else
{
await context.CallActivityAsync("A_PauseJobSync", "email");
}
return _approvalResult;
}
}
这是我的 A_SendApprovalRequestEmail Activiy 函数:
[FunctionName("A_SendApprovalRequestEmail")]
public async Task Run([ActivityTrigger] string job, TraceWriter log)
{
var functionAddress = $"http://localhost:7071/api/";
var approvedLink = functionAddress + "approve?id=MYID";
var rejectedLink = functionAddress + "reject?id=MYID";
var content = $"{approvedLink} {rejectedLink}";
await _mailRepository.SendMail("Subject", content, "<recipient-address>");
log.Info($"Requesting approval for {job}");
await Task.Delay(1000);
}
如何修改此代码以将 2 个链接连接到协调器 - 一个用于批准,一个用于拒绝(返回结果“批准”或“拒绝”)?
更新:
我添加了 2 个启动函数:
[FunctionName("Approve")]
public static async Task<IActionResult> Approve(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)]
HttpRequest req,
ILogger log,
[DurableClient] IDurableOrchestrationClient client)
{
string orchestratorId = req.Query["id"];
log.LogInformation($"Approval request for {orchestratorId}");
var status = await client.GetStatusAsync(orchestratorId);
if (status == null || status.RuntimeStatus != OrchestrationRuntimeStatus.Running)
return new NotFoundResult();
await client.RaiseEventAsync(orchestratorId, "ApprovalResult", "Approve");
return new OkObjectResult("Approval successfull");
}
[FunctionName("Reject")]
public static async Task<IActionResult> Reject(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)]
HttpRequest req,
ILogger log,
[DurableClient] IDurableOrchestrationClient client)
{
string orchestratorId = req.Query["id"];
log.LogInformation($"Reject request for {orchestratorId}");
var status = await client.GetStatusAsync(orchestratorId);
if (status == null || status.RuntimeStatus != OrchestrationRuntimeStatus.Running)
return new NotFoundResult();
await client.RaiseEventAsync(orchestratorId, "ApprovalResult", "Reject");
return new OkObjectResult("Rejected");
}
这是我在单击批准/拒绝链接时看到的:
设置断点
var status = await client.GetStatusAsync(orchestratorId);
我看到状态为空。
【问题讨论】:
标签: azure azure-functions c#-2.0 .net-core-3.1 azure-durable-functions