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

Azure Durable Functions v4与v3 HTTP Trigger请求对象差异排查

Azure Durable Functions v4 请求体/头部数据丢失问题解决

问题情况

使用Durable Functions v3时,将HTTP Trigger的req对象直接传入startNew方法,Orchestrator的input字段会自动包含headers、method、url及body等完整请求数据;但升级到v4后,直接传request对象时,input仅保留query和params,请求体、头部等关键数据全部丢失。

v3 完整input示例

"input": {
    "method": "POST",
    "url": "http://localhost:7071/api/orchestrators/analyze",
    "originalUrl": "http://localhost:7071/api/orchestrators/analyze",
    "headers": {
      "accept": "*/*",
      "connection": "keep-alive",
      "host": "localhost:7071",
      ...
    },
    ...
}

v4 缺失数据的input示例

"input": {
    "query": {},
    "params": {
      "opName": "analyze"
    }
}

问题原因

v4中的HttpRequest是类实例对象,直接传递给startNew时,序列化机制只能提取其表面的可枚举公共属性(如query、params);而body需要异步解析、headers是特殊的Headers对象,这类内容不会被自动序列化。反观v3的req是普通JavaScript对象,所有请求数据都直接挂载在对象上,因此能被完整序列化传递。

解决办法

手动构造包含所需请求数据的对象,提取body、headers、method、url等信息后传入startNew:

修改后的v4触发器代码

const { app } = require('@azure/functions');
const df = require('durable-functions');

app.http('HttpTrigger', {
    authLevel: "anonymous",
    methods: ['POST'],
    route: 'orchestrators/{opName}',
    extraInputs: [df.input.durableClient()],
    handler: async (request, context) => {
        const client = df.getClient(context);
        
        // 手动拼装完整请求数据
        const requestData = {
            method: request.method,
            url: request.url,
            headers: Object.fromEntries(request.headers), // 将Headers对象转为普通JS对象
            params: request.params,
            query: Object.fromEntries(request.query),
            body: await request.json() // 根据请求类型切换解析方式,如text()/formData()
        };

        const instanceId = await client.startNew("Orchestrator", undefined, requestData);

        context.log(`Started orchestration with ID = '${instanceId}'.`);

        return client.createCheckStatusResponse(request, instanceId);
    },
});

注意事项

  • 根据请求的Content-Type选择对应的body解析方法:
    • JSON格式:await request.json()
    • 纯文本:await request.text()
    • 表单数据:await request.formData()
  • request.headers是Headers类型,必须用Object.fromEntries()转为普通对象才能被正确序列化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 03:52:44