asp.net如何获取【网站用户登录的外网IP和IP所在区域】

解决方案 »

  1.   

    获得 IP HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]
    获取区域,需要配合一个IP数据库对应查找。因为没有什么规律或者算法可以推算出来。
      

  2.   

    http://blog.csdn.net/porschev/article/details/6335519可以试试我这个山寨方法。。
      

  3.   


    private void button5_Click(object sender, EventArgs e)
            {
                string[] strs = this.GetUserIpAddr("202.99.96.68")            Result: "天津市 联通"
            }        /// <summary>
            /// 获取客户端的用户地址信息 ydh 2010-9-15 
            /// </summary>
            /// <param name="PostIp"></param>
            /// <returns></returns>
            private  string GetUserPositionNew2010(string PostIp)
            {
                try
                {                
                    string url = "http://www.ip.cn/getip.php?action=queryip&ip_url=" + PostIp;
                    System.Net.HttpWebRequest req = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);
                    req.Method = "GET";
                    System.Net.HttpWebResponse res = (System.Net.HttpWebResponse)req.GetResponse();
                    System.IO.StreamReader sr = new System.IO.StreamReader(res.GetResponseStream(), System.Text.Encoding.Default);
                    string backstr = sr.ReadToEnd();
                    sr.Close();
                    res.Close();
                    return backstr;
                }
                catch
                {
                    return "";
                }
            }        /// <summary>
            /// 获取客户端的用户地址信息(具体的地址)
            /// </summary>
            /// <param name="IpStr"></param>
            /// <returns>返回多个查询结果,最多三个。其中第三个的最为准确</returns>
            public  string[] GetUserIpAddr(string IpStr)
            {
                try
                {
                    string end1 = string.Empty;
                    string end2 = string.Empty;
                    string end3 = string.Empty;
                                  
                    string strAddrHtml = GetUserPositionNew2010(IpStr);//获取带信息的返回值
                    int Iposition = strAddrHtml.IndexOf("来自:", 0, strAddrHtml.Length);//截取有用数据
                    if (Iposition > 0)
                    {
                        int Ilen = "来自:".Length;
                        end1 = strAddrHtml.Substring(Iposition + Ilen);
                    }                return new string[] { end1, end1, end1 };
                }
                catch
                {
                    return new string[] { "", "", "" };
                }
            }
      

  4.   


    我试了,返回的这句“return "IP:" + ip + "  国家:" + country + "  省市:" + adr;”
    里面得ip、国际、省市,都是空的  
      

  5.   

    HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]这个就可以。
      

  6.   

    把你的代码放到服务器上,在本地访问服务器上的,就发现是对的了。。
    porschev的方法可以,正则需要改下
    就是这句:string regStr = "(?<=<span id=\"InputIPAddrMessage\">).*?(?=</span>)";
    要不取到的是本机ip地址的所在地。
      

  7.   


    CSDN博客的问题引号转义/"转成\"
      

  8.   

    gogogo
      

  9.   

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Configuration;
    using System.IO;
    using System.Xml;
    using System.Text.RegularExpressions;
    using System.Net;
    using System.Text;public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            Response.Write(GetIpDetails());       
        }    #region##得到真实IP以及所在地详细信息    
        /// <summary>    
        /// 得到真实IP以及所在地详细信息(Porschev)    
        /// </summary>    
        /// <returns></returns>    
        public string GetIpDetails()    
        {        
            string url = "http://www.ip138.com/ips8.asp";   //设置获取IP地址和国家源码的网址        
            string regStr = "(?<=<td\\s*align=\\\"center\\\">)[^<]*?(?=<br/><br/></td>)";          
            string ipRegStr = "((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)";    //IP正则                
            string ip = string.Empty;   //IP地址        
            string country = string.Empty;  //国家        
            string adr = string.Empty;   //省市        
            string html = GetHtml(url);       //得到网页源码        
            Regex reg = new Regex(regStr, RegexOptions.None);               
            Match ma = reg.Match(html);        html = ma.Value;              
            Regex ipReg = new Regex(ipRegStr, RegexOptions.None);        
            ma = ipReg.Match(html);        
            ip = ma.Value;     //得到IP        
            int index = html.LastIndexOf(":") + 1;        
            country = html.Substring(index);                   //得到国家        
            adr = GetAdrByIp(ip);        
            return "IP:" + ip + "  国家:" + country + "  省市:" + adr;   
        }        
        #endregion       #region##通过IP得到IP所在地省市    
        /// <summary>    
        /// 通过IP得到IP所在地省市(Porschev)    
        /// </summary>    
        /// <param name="ip"></param>    
        /// <returns></returns>    
        public string GetAdrByIp(string ip)    
        {        
            string url = "http://www.cz88.net/ip/?ip=" + ip;        
            string regStr = "(?<=<span\\s*id=\\\"cz_addr\\\">).*?(?=</span>)";                
            string html = GetHtml(url);       //得到网页源码        
            Regex reg = new Regex(regStr, RegexOptions.None);        
            Match ma = reg.Match(html);                
            html = ma.Value;          
            string[] arr = html.Split(' ');        
            return arr[0];    
        }    
        #endregion    
        
        #region##获取HTML源码信息    
        /// <summary>    
        /// 获取HTML源码信息(Porschev)    
        /// </summary>    
        /// <param name="url">获取地址</param>    
        /// <returns>HTML源码</returns>    
        public string GetHtml(string url)    
        {        
            Uri uri = new Uri(url);        
            WebRequest wr = WebRequest.Create(uri);        
            Stream s = wr.GetResponse().GetResponseStream();        
            StreamReader sr = new StreamReader(s, Encoding.Default);                
            return sr.ReadToEnd();    
        }    
        #endregion
    }
      

  10.   


    http://blog.csdn.net/porschev/article/details/6335519博客也重新编辑了一下
      

  11.   

    回复 
    porschev 谢谢,你的这个可以用,但是是依赖其他网站的,有没有,另外的方法 不依赖其他网站的
      

  12.   

    楼主可以到http://www.cz88.net/下载一个纯真IP地址库安装,执行查询程序解压缩成一个文本文件。然后可以用类似下面的程序解析和查询IP地址信息,当然你也可以保存到数据库中查询
    public class cz88Ip
        {
            public uint start;
            public uint end;
            public string address;
            public string company;
            private static readonly cz88Ip[] Ips;
            public static cz88Ip get(uint ipv4)
            {
                int index = 0;
                if (Ips.Length != 0)
                {
                    int average, length = Ips.Length;
                    while (index < length)
                    {
                        if (ipv4 >= Ips[average = (index + length) >> 1].start) index = average + 1;
                        else length = average;
                    }
                }
                cz88Ip value = null;
                if (index != Ips.Length)
                {
                    value = Ips[index];
                    if (value.end < ipv4) value = null;
                }
                return value;
            }
            public static cz88Ip get(string ipv4)
            {
                uint ip = parseRange(ipv4);
                return ip == 0 ? null : get(ip);
            }
            public static unsafe uint parseRange(string ipv4)
            {
                uint value = 0;
                if (ipv4 != null && ipv4.Length >= 7 && ipv4.Length <= 15)
                {
                    fixed (char* ipFixed = ipv4)
                    {
                        int count = 3;
                        uint ipValue = uint.MaxValue;
                        for (char* ip = ipFixed, end = ipFixed + ipv4.Length; ip != end; ++ip)
                        {
                            if (*ip == '.')
                            {
                                if (ipValue > 255) break;
                                else
                                {
                                    --count;
                                    value <<= 8;
                                    value |= ipValue;
                                    ipValue = uint.MaxValue;
                                }
                            }
                            else
                            {
                                uint nextValue = (uint)(*ip - '0');
                                if (nextValue < 10)
                                {
                                    if (ipValue == uint.MaxValue) ipValue = nextValue;
                                    else
                                    {
                                        ipValue *= 10;
                                        ipValue += nextValue;
                                    }
                                }
                                else
                                {
                                    ipValue = uint.MaxValue;
                                    break;
                                }
                            }
                        }
                        if (ipValue > 255 || count != 0) value = 0;
                        else
                        {
                            value <<= 8;
                            value |= ipValue;
                        }
                    }
                }
                return value;
            }
            static cz88Ip()
            {
                string ipFile = showjim.config.data.cz88Ip.textFile, cz88 = "CZ88.NET";
                if (File.Exists(ipFile))
                {
                    string[] ips = File.ReadAllLines(ipFile, showjim.sys.pub.gb2312);
                    List<cz88Ip> ipList = new List<cz88Ip>(ips.Length);
                    for (int index = 0, length = ips.Length; index != length; ++index)
                    {
                        string ip = ips[index];
                        if (ip.Length >= 32)
                        {
                            uint start = parseRange(ip.Substring(0, 16).TrimEnd());
                            string address = start >= 0xffffff00 ? String.Empty : ip.Substring(32);
                            if (address.EndsWith(cz88)) address = address.Substring(0, address.Length - cz88.Length).Trim();
                            int addressIndex = address.IndexOf(' ');
                            ipList.Add(new cz88Ip
                            {
                                start = start,
                                end = parseRange(ip.Substring(16, 16).TrimEnd()),
                                address = addressIndex == -1 ? address : address.Substring(0, addressIndex),
                                company = ++addressIndex == 0 || addressIndex == address.Length ? null : address.Substring(addressIndex)
                            });
                        }
                        else break;
                    }
                    Ips = ipList.ToArray();
                }
                else Ips = new cz88Ip[0];
            }
        }