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

Python Azure Durable Functions同步调用编排器等待活动报错排查

解决方案

无需修改function.json中的HTTP输出绑定配置,你当前的绑定配置完全符合规范,报错由客户端代码的几处问题导致:

  • 入参类型不合法:req.get_body()返回值为bytes类型,Durable Functions Python SDK要求编排器入参必须支持JSON序列化,直接传入bytes会触发class <class 'bytes'> does not expose a 'to_json' function'报错。
  • 异步方法未加等待:wait_for_completion_or_create_check_status_response是异步方法,直接调用不加await会返回协程对象,无法生成合法HTTP响应。
  • 参数类型与逻辑错误:从请求Query中获取的超时、重试间隔参数是字符串类型,直接传入SDK会触发类型错误;原代码默认值逻辑重复冗余,日志调用、f字符串写法也存在疏漏。

修正后的客户端代码

替换原有__init__.py中的代码即可:

import logging
import json
import azure.functions as func
import azure.durable_functions as df

async def main(req: func.HttpRequest, starter: str) -> func.HttpResponse:
    client = df.DurableOrchestrationClient(starter)

    # 解码请求体,兼容JSON、普通文本两类入参
    raw_body = req.get_body().decode('utf-8')
    try:
        orchestrator_input = json.loads(raw_body)
    except json.JSONDecodeError:
        orchestrator_input = raw_body

    instance_id = await client.start_new(
        req.route_params['functionName'],
        None,
        orchestrator_input
    )
    logging.info(f"Started orchestration with ID = '{instance_id}'.")

    # 读取并转换超时、重试间隔参数,单位为毫秒
    timeout_in_ms = int(req.params.get("timeout", 30000))
    retry_interval_in_ms = int(req.params.get("retryInterval", 1000))

    # 等待异步方法返回响应
    return await client.wait_for_completion_or_create_check_status_response(
        req,
        instance_id,
        timeout_in_ms,
        retry_interval_in_ms
    )

运行效果

部署后调用HTTP接口:

  • 若编排器在设定超时时间内执行完成,直接返回活动函数的最终输出结果
  • 若编排器超时未完成,自动返回包含statusQueryGetUri的状态查询响应,与原有create_check_status_response()逻辑完全兼容

内容的提问来源于stack exchange,提问作者Peter Lawrence

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 20:21:34