我正在使用Azure Functions在C#中编写一个函数,并且需要获取调用该函数的客户端的ip地址,这可能吗?
答案 0 :(得分:16)
以下是基于here的答案。
#r "System.Web"
using System.Net;
using System.Web;
public static HttpResponseMessage Run(HttpRequestMessage req, TraceWriter log)
{
string clientIP = ((HttpContextWrapper)req.Properties["MS_HttpContext"]).Request.UserHostAddress;
return req.CreateResponse(HttpStatusCode.OK, $"The client IP is {clientIP}");
}
答案 1 :(得分:12)
您应该使用这些功能Get the IP address of the remote host
如果您在本地调试预编译函数,request.Properties [“MS_HttpContext”]不可用 request.Properties [RemoteEndpointMessageProperty.Name]在azure上不可用
Content
更新21.08.2018: 现在,Azure功能位于LoadBalancer后面 - >我们必须检查Request-Headers以确定正确的客户端IP
private string GetClientIp(HttpRequestMessage request)
{
if (request.Properties.ContainsKey("MS_HttpContext"))
{
return ((HttpContextWrapper)request.Properties["MS_HttpContext"]).Request.UserHostAddress;
}
if (request.Properties.ContainsKey(RemoteEndpointMessageProperty.Name))
{
RemoteEndpointMessageProperty prop;
prop = (RemoteEndpointMessageProperty)request.Properties[RemoteEndpointMessageProperty.Name];
return prop.Address;
}
return null;
}
答案 2 :(得分:0)
现在, Azure 函数获得一个 HttpRequest 参数,并且它们位于负载均衡器的后面,该用于获取IP地址的函数对我有效:
private static string GetIpFromRequestHeaders(HttpRequest request)
{
return (request.Headers["X-Forwarded-For"].FirstOrDefault() ?? "").Split(new char[] { ':' }).FirstOrDefault();
}
答案 3 :(得分:0)
2019年10月18日更新:
我尝试过的解决方案更加简单快捷,下面逐步介绍。但在https://docs.microsoft.com/en-us/azure/azure-monitor/app/ip-collection上还有一些冗长/棘手的替代项:
答案 4 :(得分:0)
这是一种扩展方法,基于我在.Netcore 3.1中看到的内容。
public static IPAddress GetClientIpn(this HttpRequest request)
{
IPAddress result = null;
if (request.Headers.TryGetValue("X-Forwarded-For", out StringValues values))
{
var ipn = values.FirstOrDefault().Split(new char[] { ',' }).FirstOrDefault().Split(new char[] { ':' }).FirstOrDefault();
IPAddress.TryParse(ipn, out result);
}
if (result == null)
{
result = request.HttpContext.Connection.RemoteIpAddress;
}
return result;
}
答案 5 :(得分:0)
正如其他人已经提到的那样,查看MS_HttpContext
的旧方法不再起作用。此外,虽然查看X-Forwarded-For
的标头的方法确实有效,但它仅在Azure中发布后才有效-在本地运行时它不会返回值。如果您希望在本地进行测试以最大程度地减少任何潜在的成本影响,但是仍然希望能够看到一切正常,则可能会很重要。
要在本地运行时也要查看IP地址,请尝试以下操作:
using Microsoft.AspNetCore.Http;
然后:
String RemoteIP = ((DefaultHttpContext)req.Properties["HttpContext"])?.Connection?.RemoteIpAddress?.ToString();
当前在Azure Functions V3.0中对我有用。