我们正在尝试找出如何更改默认的 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 报名:
.ConfigureFunctionsWebApplication(builder =>
{
builder.UseWhen<HttpTriggerResponseMiddleware>(context =>
{
return context
.FunctionDefinition
.InputBindings
.Values
.First(a => a.Type.EndsWith("Trigger")).Type == "httpTrigger";
});
})
.ConfigureFunctionsWebApplication(builder =>
{
builder.UseMiddleware<HttpTriggerResponseMiddleware>();
})
拦截器:
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()
手动创建请求是可行的,但是我们会丢失所需/现有的响应正文和标头。
任何提示和建议将不胜感激。 先谢谢大家了!
我已经提到了这个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();
您将能够在响应标头中看到自定义标头。