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

如何为Azure Durable Function状态响应添加自定义HTTP标头

解决Durable Function状态响应添加自定义HTTP头的方法

方法一:自定义状态查询函数(推荐)

默认的状态URL是Durable Functions运行时提供的内置端点,无法直接修改它的响应头。你可以自己实现一个HTTP触发的函数来替代默认的状态查询逻辑,这样就能自由添加自定义头:

  1. 编写自定义状态查询函数
public static async Task<HttpResponseMessage> GetCustomStatus(
    [HttpTrigger(AuthorizationLevel.Function, "get")] HttpRequestMessage req,
    [DurableClient] IDurableOrchestrationClient client,
    ILogger log)
{
    // 从请求参数中获取实例ID
    var instanceId = req.RequestUri.ParseQueryString().Get("instanceId");
    if (string.IsNullOrEmpty(instanceId))
    {
        return req.CreateResponse(HttpStatusCode.BadRequest, "Missing instanceId parameter");
    }

    // 获取实例状态
    var status = await client.GetStatusAsync(instanceId);
    if (status == null)
    {
        return req.CreateResponse(HttpStatusCode.NotFound, "Instance not found");
    }

    // 构建响应
    var response = req.CreateResponse(HttpStatusCode.OK, status);
    
    // 添加自定义HTTP头 - 替换为你的结果摘要生成逻辑
    string resultSummary = string.Empty;
    if (status.RuntimeStatus == OrchestrationRuntimeStatus.Completed)
    {
        // 根据编排实际结果提取关键信息生成摘要
        resultSummary = $"Process completed with result: {status.Output?.ToString()}";
    }
    else
    {
        resultSummary = $"Process is {status.RuntimeStatus.ToString()}";
    }
    response.Headers.Add("X-Process-Summary", resultSummary);

    return response;
}
  1. 修改初始启动函数的返回逻辑
    在HttpStart函数中,不再返回默认的CreateCheckStatusResponse,而是返回指向自定义状态查询函数的URL:
public static async Task<HttpResponseMessage> HttpStart(
    [HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequestMessage req,
    [DurableClient] IDurableOrchestrationClient starter,
    ILogger log)
{
    // 启动编排器
    string instanceId = await starter.StartNewAsync("YourOrchestratorFunctionName", null);
    log.LogInformation($"Started orchestration with ID = '{instanceId}'.");

    // 构建自定义状态查询URL
    var statusUrl = new Uri(req.RequestUri, $"/api/GetCustomStatus?instanceId={instanceId}");
    
    // 返回包含自定义状态URL的响应
    var response = req.CreateResponse(HttpStatusCode.Accepted);
    response.Headers.Location = statusUrl;
    return response;
}

方法二:使用Durable Functions中间件(仅适用于.NET Isolated模型)

如果你的Durable Function基于.NET Isolated模型(非In-Process),可以通过添加HTTP中间件拦截默认状态端点的响应,添加自定义头:

  1. 在Program.cs中配置中间件
var host = new HostBuilder()
    .ConfigureFunctionsWorkerDefaults(app =>
    {
        app.UseWhen(context => 
            context.Request.Path.StartsWithSegments("/runtime/webhooks/durabletask/instances"), 
            appBuilder =>
            {
                appBuilder.Use(async (context, next) =>
                {
                    // 先执行后续中间件获取响应
                    await next();
                    
                    // 仅对GET类型的状态查询请求添加头
                    if (context.Request.Method == "GET")
                    {
                        // 读取并解析响应体中的状态信息
                        var body = await context.Response.ReadAsStringAsync();
                        var status = JsonSerializer.Deserialize<OrchestrationStatus>(body);
                        
                        // 生成结果摘要并添加自定义头
                        string summary = status.RuntimeStatus switch
                        {
                            OrchestrationRuntimeStatus.Completed => $"Completed: {status.Output}",
                            OrchestrationRuntimeStatus.Failed => $"Failed: {status.FailureReason}",
                            _ => $"Status: {status.RuntimeStatus}"
                        };
                        context.Response.Headers.Add("X-Process-Summary", summary);
                        
                        // 重新写入响应内容(因已读取过需重置)
                        await context.Response.WriteStringAsync(body);
                    }
                });
            });
    })
    .ConfigureServices(services =>
    {
        services.AddDurableTask();
    })
    .Build();

host.Run();

注意:这种方法需要处理响应体的读取和重新写入,逻辑相对复杂,不如自定义函数直观。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 04:18:21