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
相关产品推荐
相关产品推荐

