我正在运行一个运行时4,.NET 6.0的天蓝色函数应用程序。在本地运行的环境中调用函数应用程序时,req.HttpContext.GetServerVariable()
总是返回null,因为IServerVariablesFeature
在context.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);
}
}
发布于 2022-02-16 08:35:00
根据这个文档,GetServerVariable返回
如果服务器不支持IServerVariablesFeature特性,则为IServerVariablesFeature。如果变量不存在或未设置,则可能返回空或空。
解决方法之一是包括转发头中间件
在请求到达应用程序之前,代理服务器、负载平衡器和其他网络设备通常会隐藏有关请求的信息。当通过HTTP代理HTTPS请求并必须在报头中传输时,原始方案将丢失。还必须在报头中转发原始客户端IP地址,因为应用程序接收的是来自代理的请求,而不是其在Internet或公司网络上的真实来源。
来自MSDN文章
虽然仅检索REMOTE_ADDR服务器变量就足够了,但我在网上发现了一些资源,这些资源建议这样的代码也应该检查HTTP_X_FORWARDED_FOR变量;如果请求通过代理服务器来翻译地址,那么这个变量就包含正确的地址。如果您请求一个不存在的服务器变量,ServerVariables属性将返回一个空字符串。因此,即使这个属性没有出现在我的测试中,尝试检索它的值也不会带来麻烦。
转发标头中间件读取标头X-Forwarded-For
、X-Forwarded-Host
和X-Forwarded-Proto
,并填充HttpContext上相关的字段。
REFERENCES:- 如何访问ASP.Net内核中的服务器变量
https://stackoverflow.com/questions/71078670
复制相似问题