获取客户的IP地址

时间:2019-07-02 17:14:05

标签: c# asp.net ip

我正在开发一个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地址的方法?

2 个答案:

答案 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是最后一个。