Durable Functions(独立进程)活动函数中TaskActivityContext为空问题
解决.NET7独立进程Durable Functions活动函数获取编排InstanceId的问题
在.NET7独立进程Azure Functions的Durable Functions正式版(GA)中,活动函数无法通过直接注入TaskActivityContext获取编排InstanceId,替代方案是通过FunctionContext的特性集合提取相关上下文信息:
解决步骤
- 在活动函数参数中添加
FunctionContext(无需再注入TaskActivityContext) - 从
FunctionContext.Features中获取ITaskActivityFeature,该特性包含编排实例ID等核心上下文数据
修改后的活动函数代码
namespace MyNamespace; public class TestActionable { private readonly ILogger _log; public TestActionable(ILogger<TestActionable> log) => _log = log; [Function("TestActionable_Trigger")] public async Task TriggerWorkflow([DurableClient] DurableTaskClient client, [QueueTrigger(QueueNames.ACTIONABLE_TEST, Connection = BindingConnectionNames.MY_BINDINGNAME)]string q) { var now = DateTimeOffset.UtcNow.ToIsoString(); _log.LogWarning("Triggering workflow now"); await client.ScheduleNewOrchestrationInstanceAsync("TestActionable_Workflow", input: now); _log.LogWarning("Triggered"); } [Function("TestActionable_Workflow")] public static async Task RunWorkflow([OrchestrationTrigger] TaskOrchestrationContext ctx) { var log = ctx.CreateReplaySafeLogger("TestActionable_Workflow"); log.LogWarning("Workflow started with input= {input}", ctx.GetInput<string>()); var input = new { a=1337 }; var output = await ctx.CallActivityAsync<bool>("TestActionable_Activity", input); log.LogWarning("Activity completed successfully= {output}", output); log.LogWarning("Workflow complete"); } [Function("TestActionable_Activity")] public async Task<bool> RunActivity([ActivityTrigger] object input, FunctionContext context) { _log.LogWarning("Started activity, input= {i}", input); // 从FunctionContext特性中获取活动上下文 var activityFeature = context.Features.Get<ITaskActivityFeature>(); if (activityFeature == null) { _log.LogError("Failed to retrieve ITaskActivityFeature"); return false; } var instanceId = activityFeature.OrchestrationInstanceId; _log.LogWarning("The orchestration's instance id is= {InstanceId}", instanceId); _log.LogWarning("Waited 1s, activity complete"); await Task.Delay(1000); return true; } }
关键说明
ITaskActivityFeature是Durable Task Worker内置的特性,除InstanceId外还可获取活动ID等其他上下文信息- 无需从编排器手动传递InstanceId,完全通过运行时上下文获取,保持代码解耦
内容的提问来源于stack exchange,提问作者baouss
相关产品推荐
相关产品推荐

