【问题标题】:Azure Function App - HttpContext IServerVariablesFeature not supported in local environmentAzure Function App - 本地环境不支持 HttpContext IServerVariablesFeature
【发布时间】:2022-02-16 16:35:00
【问题描述】:

我正在运行具有运行时 4、.NET 6.0 的 azure 函数应用程序。 当我在本地运行的环境中调用函数应用程序时,req.HttpContext.GetServerVariable() 始终返回 null,因为 IServerVariablesFeaturecontext.Features 列表中不受支持。

当我将它部署到函数应用的 azure 托管实例时,变量会正确填充。我进行了广泛的研究,但无法确定这是否是故意不支持的,或者我是否在本地环境中缺少某种形式的附加配置。

这是一个测试函数,它尝试读取 3 个不同的服务器变量并将它们作为字符串返回,并且可以使用 postman 中的 get 请求或通过浏览器 http://localhost:7071/api/GetServerVariable 调用:

    public static class TestFunction
    {
        [FunctionName("GetServerVariable")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "GetServerVariable")] HttpRequest req,
            ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

            var url = req.HttpContext.GetServerVariable("URL");
            var remoteAddr = req.HttpContext.GetServerVariable("REMOTE_ADDR");
            var https = req.HttpContext.GetServerVariable("HTTPS");

            var response = $"Current server variables: URL: {url} - REMOTE_ADDR: {remoteAddr} - HTTPS: {https}";

            log.LogWarning(response);

            return new OkObjectResult(response);
        }
    }

【问题讨论】:

    标签: c# azure-functions httprequest


    【解决方案1】:

    根据这个document,GetServerVariable 返回

    null 如果服务器不支持 IServerVariablesFeature 功能。如果变量不存在或未设置,则可能返回 null 或空。

    其中一种解决方法是包含Forwarded headers Middleware

    在请求到达应用程序之前,代理服务器、负载平衡器和其他网络设备通常会隐藏有关请求的信息。当 HTTPS 请求通过 HTTP 代理时,原始方案丢失,必须在标头中传输。原始客户端 IP 地址也必须在标头中转发,因为应用接收来自代理的请求,而不是其在 Internet 或公司网络上的真实来源。

    来自MSDN article

    虽然只检索 REMOTE_ADDR 服务器变量就足够了,但我在网上找到了建议这样的代码也应该检查 HTTP_X_FORWARDED_FOR 变量的资源;如果请求来自转换地址的代理服务器,则此变量包含正确的地址。如果您请求一个不存在的服务器变量,ServerVariables 属性将返回一个空字符串。因此,即使这个属性没有出现在我的测试中,尝试检索它的值也不会造成麻烦。

    转发的标头中间件读取标头X-Forwarded-ForX-Forwarded-HostX-Forwarded-Proto并填写HttpContext上的相关字段。

    参考:- How to access server variables in ASP.Net Core

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-20
      • 2018-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-15
      • 2018-11-28
      • 1970-01-01
      相关资源
      最近更新 更多