我正在开发一个ASP.NET项目,我需要确定客户端的IP地址。
当前,我们的生产服务器上的以下代码
HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"].ToString();
返回与生产服务器IP地址在同一子网中的IP地址(即,不能解决我的问题,因为它不能解决 客户的IP地址)。
但是,在我们的测试服务器上,同一行代码返回了客户端的IP地址(期望的结果)。有人知道为什么吗?
我尝试将以下代码行用于以下值,所有值都返回null或空字符串:
"HTTP_X_COMING_FROM"
"HTTP_X_FORWARDED_FOR"
"HTTP_X_FORWARDED"
"HTTP_X_REAL_IP"
"HTTP_VIA"
"HTTP_COMING_FROM"
"HTTP_FORWARDED_FOR"
"HTTP_FORWARDED"
"HTTP_FROM"
"HTTP_PROXY_CONNECTION"
"CLIENT_IP"
"FORWARDED"
作为替代方案,我发现以下代码确实返回IP数组并包含客户端的IP地址(在索引4):
string strHostName = System.Net.Dns.GetHostName();
IPHostEntry ipEntry = System.Net.Dns.GetHostEntry(strHostName);
IPAddress[] addr = ipEntry.AddressList;
string ip = addr[4] != null ? addr[4].ToString() : "";
在调试时,我注意到addr中的IPAddress对象具有(A)如果是IPv6地址的地址错误,或者(B)ScopeId错误 如果是IPv4地址。这些错误似乎不是问题,但我不确定它们在生产中是否会很重要。
是否有比我这里拥有的方法更好的获取客户端IP地址的方法?
答案 0 :(得分:0)
获取当前HTTP请求的HttpRequestBase对象。
Request.UserHostAddress
您可以获得客户的IP地址。
答案 1 :(得分:0)
您可以使用此功能获取IP地址。
private string GetUserIP()
{
string ipList = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (!string.IsNullOrEmpty(ipList))
{
var ips= ipList.Split(',');
return ips[ips.Length - 1];
}
return Request.ServerVariables["REMOTE_ADDR"];
}
注意:HTTP_X_FORWARDED_FOR标头可能具有多个IP。正确的IP是最后一个。