.net 获取客户端外网ip

IPHelper.cs

    public class IPHelper
    {
        public static string GetClientIP()
        {
            return GetClientIP(HttpContext.Current);
        }

        public static string GetClientIP(HttpContext context)
        {
            string text = string.Empty;
            text = context.Request.ServerVariables["HTTP_CDN_SRC_IP"];
            if (!string.IsNullOrEmpty(text) && IsIPAddress(text) && !IsInnerIP(text))
            {
                return text;
            }
            text = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
            if (!string.IsNullOrEmpty(text))
            {
                if (text.IndexOf(".") < -1)
                {
                    text = null;
                }
                else if (text.IndexOf(",") > -1 || text.IndexOf(";") > -1)
                {
                    text = text.Replace(" ", "").Replace("'", "").Replace("\"", "");
                    string[] array = text.Split(",;".ToCharArray());
                    for (int i = 0; i < array.Length; i++)
                    {
                        if (IsIPAddress(array[i]) && !IsInnerIP(array[i]))
                        {
                            return array[i];
                        }
                    }
                }
                else
                {
                    if (IsIPAddress(text) && !IsInnerIP(text))
                    {
                        return text;
                    }
                    text = null;
                }
            }
            if (string.IsNullOrEmpty(text))
            {
                text = context.Request.ServerVariables["REMOTE_ADDR"];
            }
            if (string.IsNullOrEmpty(text))
            {
                text = context.Request.UserHostAddress;
            }
            return text;
        }

        public static bool IsIPAddress(string ipAddress)
        {
            if (string.IsNullOrEmpty(ipAddress))
            {
                return false;
            }
            ipAddress = ipAddress.Trim();
            if (ipAddress.Length < 7 || ipAddress.Length > 15)
            {
                return false;
            }
            string pattern = @"^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$";
            Regex regex = new Regex(pattern, RegexOptions.IgnoreCase);
            return regex.IsMatch(ipAddress);
        }

        public static bool IsInnerIP(String ipAddress)
        {
            bool isInnerIp = false;
            long ipNum = GetIpNum(ipAddress);
            /***** ***** ***** ***** ***** *****
            私有IP:
            A类 10.0.0.0-10.255.255.255
            B类 172.16.0.0-172.31.255.255
            C类 192.168.0.0-192.168.255.255
            还有127.0.0.1这个环回地址 
            ***** ***** ***** ***** ***** *****/
            long aBegin = GetIpNum("10.0.0.0");
            long aEnd = GetIpNum("10.255.255.255");
            long bBegin = GetIpNum("172.16.0.0");
            long bEnd = GetIpNum("172.31.255.255");
            long cBegin = GetIpNum("192.168.0.0");
            long cEnd = GetIpNum("192.168.255.255");
            isInnerIp = IsInner(ipNum, aBegin, aEnd) || IsInner(ipNum, bBegin, bEnd) || IsInner(ipNum, cBegin, cEnd) || ipAddress.Equals("127.0.0.1");
            return isInnerIp;
        }

        private static long GetIpNum(String ipAddress)
        {
            String[] ip = ipAddress.Split('.');
            long a = int.Parse(ip[0]);
            long b = int.Parse(ip[1]);
            long c = int.Parse(ip[2]);
            long d = int.Parse(ip[3]);
            long ipNum = a * 256 * 256 * 256 + b * 256 * 256 + c * 256 + d;
            return ipNum;
        }

        private static bool IsInner(long userIp, long begin, long end)
        {
            return (userIp >= begin) && (userIp <= end);
        }
    }

  

posted @ 2018-11-07 17:50  by-lhc  阅读(723)  评论(0编辑  收藏  举报