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()
- JSON格式:
request.headers是Headers类型,必须用Object.fromEntries()转为普通对象才能被正确序列化。
内容的提问来源于stack exchange,提问作者Derick
相关产品推荐
相关产品推荐

