如何向Durable Functions的CreateCheckStatusResponse响应附加自定义数据
实现方案
完全可以在不修改instanceId、不拉长URL的前提下向返回结果追加自定义字段,核心思路是直接修改CreateCheckStatusResponse返回的响应内容,无需改动Durable Functions的内置逻辑。
推荐实现方式
你调用CreateCheckStatusResponse拿到默认响应对象后,手动向响应体或者响应头追加自定义业务字段即可,两种实现可选:
方式1:追加到响应体(和默认状态字段平级)
修改返回的JSON结构,将业务ID和内置的id、statusQueryGetUri等字段平级返回,客户端可以直接从响应体读取。
以下是进程内(In-Process)模型的代码示例:
string instanceId = await starter.StartNewAsync("SendCorrespondence", request); var correspondenceId = Guid.NewGuid().ToString(); // 获取默认的状态响应 var checkStatusResponse = starter.CreateCheckStatusResponse(req, instanceId); // 读取原有响应内容,追加自定义字段 var originalContent = await checkStatusResponse.Content.ReadAsStringAsync(); var responseJson = JObject.Parse(originalContent); responseJson["correspondenceId"] = correspondenceId; // 替换为修改后的响应内容 checkStatusResponse.Content = new StringContent(responseJson.ToString(), Encoding.UTF8, "application/json"); return checkStatusResponse;
如果使用隔离工作者(Isolated Worker)模型,修改逻辑类似,操作HttpResponseData的Body属性即可。
方式2:追加到响应头(更轻量)
如果不想修改默认的响应体结构,可以直接把业务ID放到自定义响应头里,客户端直接读头取值即可,实现更简单:
string instanceId = await starter.StartNewAsync("SendCorrespondence", request); var correspondenceId = Guid.NewGuid().ToString(); var checkStatusResponse = starter.CreateCheckStatusResponse(req, instanceId); // 追加自定义响应头 checkStatusResponse.Headers.Add("X-Correspondence-Id", correspondenceId); return checkStatusResponse;
说明
两种方案都不会改动Durable Functions内置的instanceId规则,也不会导致返回的URL变长,完全满足不需要轮询即可直接拿到业务ID的需求。
内容的提问来源于stack exchange,提问作者SlavingToCode
相关产品推荐
相关产品推荐

