Azure Durable Function - 将自定义标头添加到触发器中的 202 响应

问题描述 投票:0回答:1

我们正在尝试找出如何更改默认的 202 响应,并在调用的触发函数成功时添加自定义标头。

我们尝试这样做的原因是保留现有的响应内容和标头,例如

Content-Type: application/json; charset=utf-8
Location: http://localhost:7071/runtime/webhooks/durabletask/instances/abc123?code=XXX

{
"id": "abc123",
"purgeHistoryDeleteUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/abc123?code=XXX",
"sendEventPostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/abc123/raiseEvent/%7BeventName%7D?code=XXX",
"statusQueryGetUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/abc123?code=XXX",
"terminatePostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/abc123/terminate?reason=%7Btext%7D&code=XXX"
}

此结构是在调用 DurableTaskClient 时自动生成的,如下所示:

var response = await orchestrationClient.CreateCheckStatusResponseAsync(request, orchestrationInstanceId);

有没有优雅的方法来向此响应添加标头?

我们尝试过: 简单地添加标题 - 没有效果。

response.Headers.Add("myHeader", "myHeaderValue");

使用中间件方法实现 IFunctionsWorkerMiddleware 报名:

  • 2 种变体
.ConfigureFunctionsWebApplication(builder =>
 {
     builder.UseWhen<HttpTriggerResponseMiddleware>(context =>
     {
         return context
             .FunctionDefinition
             .InputBindings
             .Values
             .First(a => a.Type.EndsWith("Trigger")).Type == "httpTrigger";
     });
 })
.ConfigureFunctionsWebApplication(builder =>
{
    builder.UseMiddleware<HttpTriggerResponseMiddleware>();
})

拦截器:

  • 还尝试摆弄 context.GetInitationResult() - 没有效果
  • await next(context) 放置可能是一个问题,但是任何其他放置都会导致 GetHttpresponseData 返回 null
        public async Task Invoke(FunctionContext context, FunctionExecutionDelegate next)
        {
            await next(context);

            var headers = context.GetHttpResponseData()?.Headers;
            if (headers == null)
            {
                return;
            }

            headers.Add(Constants.RequestConstants.CorrelationId, contextHelper.CorrelationId);
            headers.Add(Constants.RequestConstants.SourceApplication, contextHelper.SourceApplication);
        }

现在,我们发现,每当我们更改/拦截响应时,我们都会看到两个标头“Location”和“Content-Type”已经就位,它们由 DurableTaskClient 创建并在 Microsoft 文档中进行了描述。

但是,任何手动更改都不会影响返回的响应,但不知何故,最终会在某处附加三个标头 - “Server”、“Date”和“Transfer-Econding”。

请注意,使用

request.CreateResposne()
手动创建请求是可行的,但是我们会丢失所需/现有的响应正文和标头。

任何提示和建议将不胜感激。 先谢谢大家了!

azure azure-functions azure-durable-functions response-headers azure-http-trigger
1个回答
0
投票

我已经提到了这个SO Thread并使用中间件在持久功能中添加自定义标头。

public class HttpTriggerResponseMiddleware : IFunctionsWorkerMiddleware
{
    public async Task Invoke(FunctionContext context, FunctionExecutionDelegate next)
    {
        var requestData = await context.GetHttpRequestDataAsync();

        await next(context);

        context.GetHttpResponseData()?.Headers.Add("myHeader", "myHeaderValue");

    }
}

我正在使用默认的隔离持久功能代码。 我在program.cs文件中有以下代码。

var host = new HostBuilder()
    .ConfigureFunctionsWorkerDefaults(workerApplication =>
    {
        workerApplication.UseWhen<HttpTriggerResponseMiddleware>((context) =>
        {
            return context.FunctionDefinition.InputBindings.Values
                      .First(a => a.Type.EndsWith("Trigger")).Type == "httpTrigger";
        });
    })
    .Build();

host.Run();

您将能够在响应标头中看到自定义标头。

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.