向Azure Functions响应添加自定义标头

kgsdhlau  于 2023-04-22  发布在  其他
关注(0)|答案(3)|浏览(143)

我正在开发一个Azure Function App(v2),它在同一个Function App中有许多不同的函数。
它将部署在多个Azure区域中,我想添加一个自定义头,以指示哪个区域为请求提供服务。
我知道我可以让每个函数返回HttpResponseMessage,它可以包含自定义头。我不想把代码复制到每个函数,而是想把它集中在整个Function App项目中。返回HttpResponseMessage的另一个缺点是我想使用IActionResult,所以我可以使用JsonResultOkObjectResult以及类似的返回类型。
在ASP.NETMVC项目中,我可以添加一个中间件来添加头文件,或者使用web.config添加头文件。
如何才能做到这一点,而不必返回HttpResponseMessage并在每个函数的Run方法中添加头部?

zbwhf8kr

zbwhf8kr1#

我可以通过请求的HttpContext访问HttpResponse对象来做到这一点。
例如:

req.HttpContext.Response.Headers.Add("ETag", entity.ETag);
return new OkObjectResult(entity);

生产:

5cg8jx4n

5cg8jx4n2#

在研究完全相同的问题时,我沿着this blog post。基本上,您派生了一个自定义类,用于JsonResult,OKResult等,并操作ExecuteResultAsync方法并在那里添加您的头。

public class ServiceUnavailableResult : StatusCodeResult {
    private readonly int _retryAfterHeaderValue;

    public ServiceUnavailableResult(int retryAfterHeaderValue) : base(500) {
        _retryAfterHeaderValue = retryAfterHeaderValue;
    }

    public override async Task ExecuteResultAsync(ActionContext context) {
        await base.ExecuteResultAsync(context);
        
        context.HttpContext.Response.Headers.Add("Retry-After", _retryAfterHeaderValue.ToString());
    }
}

它并不能完全帮助你,但是如果你在返回内容时只使用两三个类,它可能会帮助你。

yhived7q

yhived7q3#

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

注册

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();

执行情况

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

(code改编自GitHub sample

相关问题