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

.NET Isolated Azure Function调用子编排器时出现异步调用无效错误

.NET 8 Azure Functions v4 Isolated模式下Durable Orchestrator异步调用异常排查

异常信息

System.InvalidOperationException: 'An invalid asynchronous invocation was detected. This can be caused by awaiting non-durable tasks in an orchestrator function's implementation or by middleware that invokes asynchronous code.'

问题根源

你的主编排器中直接执行了非Durable框架管理的异步操作:await _sender.CreateMessageBatchAsync();。Durable Orchestrator基于重放机制运行,要求所有异步操作必须通过TaskOrchestrationContext提供的方法(如CallSubOrchestratorAsync、CallActivityAsync、CallHttpAsync)发起,否则无法持久化操作状态,触发重放一致性校验异常。

解决方案

将ServiceBus相关的异步操作移至Activity Function中执行(Activity不受Orchestrator的异步约束),再由Orchestrator通过上下文调用该Activity。

1. 新增Activity Function处理ServiceBus批次创建

[Function("A_CreateServiceBusBatch")]
public async Task<ServiceBusMessageBatch> CreateServiceBusBatch([ActivityTrigger] FunctionContext executionContext)
{
    var sender = executionContext.InstanceServices.GetRequiredService<ServiceBusSender>();
    return await sender.CreateMessageBatchAsync();
}

2. 修改主编排器代码

移除直接调用CreateMessageBatchAsync的逻辑,改为通过TaskOrchestrationContext调用上述Activity:

public async Task<bool> StudentEnrollmentUpdated(
    [OrchestrationTrigger] TaskOrchestrationContext ctx,
    StudentEnrollment studentEnrollment,
    FunctionContext executionContext
)
{
    // ...原有其他代码...

    // 通过Activity创建消息批次,而非直接在Orchestrator中执行异步操作
    ServiceBusMessageBatch batch = await ctx.CallActivityAsync<ServiceBusMessageBatch>("A_CreateServiceBusBatch", null);

    var parallelTasks = new Task<PlatformEnrollmentMessage>[pqcs.Count];
    try
    {
        for (var i = 0; i < pqcs.Count; i++)
        {
            var inputs = new CreatePlatformEnrollmentMessageInputs()
            {
                QuizConfiguration = pqcs[i],
                User = ltiUser,
                Enrollment = studentEnrollment,
                DeliveryData = customData
            };
            parallelTasks[i] = ctx.CallSubOrchestratorAsync<PlatformEnrollmentMessage>("SO_CreatePlatformEnrollmentMessage", inputs);
        }
    }
    catch (Exception ex)
    {
        var d = true;
    }
    await Task.WhenAll(parallelTasks);

    // ...原有其他代码...
}

补充说明

  • 子编排器中若需调用HTTP接口,必须使用ctx.CallHttpAsync而非自行实例化HttpClient,确保请求状态被Durable框架持久化,支持重放一致性。
  • Orchestrator中所有异步逻辑都需通过TaskOrchestrationContext的方法发起,禁止直接await外部异步任务(如数据库操作、第三方API调用等)。

内容的提问来源于stack exchange,提问作者Chris Rockwell

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 01:36:09