You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 21:15:06