【问题标题】:Adding custom headers to Azure Functions response将自定义标头添加到 Azure Functions 响应
【发布时间】:2019-06-10 13:41:31
【问题描述】:

我正在开发一个 Azure Function App (v2),它在同一个 Function App 中具有许多不同的功能。

它将部署在多个 Azure 区域,我想添加一个自定义标头,指示哪个区域为请求提供服务。

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

使用 ASP.NET MVC 项目,我可以添加一个中间件来添加标头或使用 web.config 添加标头。在函数应用程序中似乎都不可能。

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

【问题讨论】:

标签: azure azure-functions


【解决方案1】:

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

例如:

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

产生:

【讨论】:

  • 我尝试对OkObjectResult 进行子分类,但我无法从那里设置标题。真的希望让它更干净。还有其他想法吗?
  • @BillNoel 自定义标头需要在 Response 上设置,而不是结果。结果只关心返回值、状态码和内容类型(我相信这会影响响应的 Content-Type 标头),但是要设置自定义标头,您需要使用 @ 987654328@.
  • 在哪里可以找到 HttpRequestMessage 对象中的响应标头?
【解决方案2】:

在研究完全相同的问题时,我遇到了this blog post。 基本上,您从 JsonResult、OKResult 等派生一个自定义类并操作 ExecuteResult 方法并在那里添加您的标头。

public class ServiceUnavailableResult : StatusCodeResult {
    private readonly int _retryAfterHeaderValue;

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

    public override void ExecuteResult(ActionContext context) {
        base.ExecuteResult(context);
        
        context.HttpContext.Response.Headers.Add("Retry-After", _retryAfterHeaderValue.ToString());
    }
}

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

【讨论】:

    猜你喜欢
    • 2021-12-28
    • 1970-01-01
    • 2018-10-04
    • 2018-02-26
    • 2017-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-27
    相关资源
    最近更新 更多