将自定义标头添加到Azure Functions响应

Ras*_*usW 5 azure azure-functions

我正在使用Azure Function App(v2),该程序在同一Function App中具有许多不同的功能。

它将被部署在多个Azure区域中,我想添加一个自定义标头,以指示哪个区域满足了请求。

我知道我可以让每个函数返回HttpResponseMessage包含自定义标头的函数。我不想将代码复制到每个功能中,而是希望将其集中在整个Function App项目中。返回的另一个缺点HttpResponseMessage是我想使用IActionResult,因此可以使用JsonResultOkObjectResult和类似的返回类型。

对于ASP.NET MVC项目,我可以添加一个添加了标题的中间件,或者使用来添加标题web.config。在功能应用程序中似乎都不可行。

如何做到这一点而不必HttpResponseMessage在每个函数的Run方法内返回并添加标头?

bvp*_*vpb 24

我能够HttpResponse通过请求的访问对象来做到这一点HttpContext.

例如:

req.HttpContext.Response.Headers.Add("ETag", entity.ETag);
return new OkObjectResult(entity);
Run Code Online (Sandbox Code Playgroud)

产生: 在此处输入图片说明

  • @BillNoel 自定义标头需要在“Response”而不是结果上设置。结果只涉及返回值、状态代码和内容类型(我相信这会影响响应的 *Content-Type* 标头),但要设置自定义标头,您需要使用“HttpResponse”。 (2认同)

Ras*_*usW 2

现在可以注入中间件,将自定义标头添加到函数响应中。

登记

public static void Main()
{
  var host = new HostBuilder()
    .ConfigureFunctionsWorkerDefaults(workerApplication =>
    {
      workerApplication.UseWhen<StampHttpHeaderMiddleware>((context) =>
      {
        // We want to use this middleware only for http trigger invocations.
        return context.FunctionDefinition.
          InputBindings.Values.First(
            a => a.Type.EndsWith("Trigger")).Type == "httpTrigger";
      });
    })
   .Build();
  host.Run();
Run Code Online (Sandbox Code Playgroud)

执行

internal sealed class StampHttpHeaderMiddleware : IFunctionsWorkerMiddleware
{
    public async Task Invoke(FunctionContext context, FunctionExecutionDelegate next)
    {
      context.GetHttpResponseData()?.Headers.Add("x-myCustomHeader", "custom header value");
    }
}
Run Code Online (Sandbox Code Playgroud)

(代码改编自GitHub示例