Получение IP-адреса клиента - PullRequest
1 голос
/ 02 июля 2019

Я занимаюсь разработкой проекта ASP.NET, и мне нужно определить IP-адрес клиента.

В настоящее время следующий код на нашем производственном сервере

HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"].ToString();

возвращает IP-адрес, который находится в той же подсети, что и IP-адрес производственного сервера (т. Е. Не решает мою проблему, поскольку IP-адрес клиента).

Однако на нашем тестовом сервере эта же строка кода возвращает IP-адрес клиента (желаемый результат). У кого-нибудь есть идеи, почему?

Я пытался использовать вышеприведенную строку подстановки кода в следующих значениях, все из которых возвращают ноль или пустую строку:

"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() : ""; 

Во время отладки я заметил, что объекты IPAddress в addr имеют либо (A) ошибки адреса, если это адрес IPv6, либо (B) ошибки ScopeId если это адрес IPv4. Эти ошибки, похоже, не являются проблемой, но я не уверен, будут ли они когда-нибудь иметь значение в работе.

Есть ли лучший способ получить IP-адрес клиента, чем у меня здесь?

Ответы [ 2 ]

0 голосов
/ 03 июля 2019

Вы можете использовать эту функцию для получения 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 последний.

0 голосов
/ 03 июля 2019

Получает объект HttpRequestBase для текущего HTTP-запроса.

Request.UserHostAddress

Вы можете получить IP-адрес клиента.

...