有一个方法,根据IP获取城市信息,然后根据不同的城市信息做不同的处理
现在是单独测试这个方法没有问题,但是访问量大了就不准确了

解决方案 »

  1.   

    //调用方法根据Aid和客户端IP的信息来判断
            string aid = "5";
            IpLimitBiz biz = new IpLimitBiz();
            if (biz.IsPopByIP(aid))
            {
                //显示
            }
            else
            {
               //不显示
            }
            //IpLimitBiz类的方法 判断是否显示
            public bool IsPopByIP(string aid)
            {
                bool isPop = true;
                Entity.IpLimit limit = ACache.GetLimitaidInfo(aid);
                if (limit != null)
                {
                    string ip = IPAccess.GetClientIP().Split(',')[0];
                    string ipnum = IPAccess.IPtoNum(ip).ToString();
                    DataTable dt = ACache.GetIPInfo(ipnum);
                    if (dt.Rows.Count > 0)
                    {
                        string province = dt.Rows[0]["province"].ToString();
                        string[] provinces = limit.Province.Replace(",", ",").Split(',');
                        for (int i = 0; i < provinces.Length; i++)
                        {
                            if (province.IndexOf(provinces[i]) == -1)
                            {
                                isPop = false;
                            }
                            else
                            {
                                isPop = true;
                                break;
                            }
                        }
                    }
                }
                return isPop;
            }
            //ACache类的方法在IsPopByIP中调用 
            public static Entity.IpLimit GetLimitaidInfo(string aid)
            {
                Entity.IpLimit limit = null;
                string key = "IpLimitList";
                DataTable dt = (DataTable)HttpContext.Current.Cache.Get(key);
                if (dt == null)
                {            
                    string sql = "select * from IpLimit";
                    dt = SqlHelper.ExecuteDataset(SqlHelper.DBCONN, CommandType.Text, sql).Tables[0];                
                    HttpContext.Current.Cache.Insert(key, dt.Copy(), null, DateTime.Now.AddMinutes(10.0), TimeSpan.Zero);
                }
                if (dt.Rows.Count > 0)
                {
                    DataRow[] dr = dt.Select("aid='" + aid + "'");
                    if (dr.Length > 0)
                    {
                        limit = new Entity.IpLimit();
                        limit.ID = int.Parse(dr[0]["id"].ToString());
                        limit.aid = int.Parse(dr[0]["aid"].ToString());
                        limit.Province = dr[0]["Province"].ToString();
                    }
                }
                return limit;
            }
            //ACache类的方法在IsPopByIP中调用 
             public static DataTable GetIPInfo(string ipnum)
            {
                string sql = "select  *  from  dbo.IpSource where  ipnum1<=" + ipnum + " and ipnum2>=" + ipnum;
                DataTable dt =  SqlHelper.ExecuteDataset(SqlHelper.DBCONNLOG, CommandType.Text, sql).Tables[0];
                return dt;
            }
            //IPAccess类的方法在IsPopByIP中调用 获取客户端IP
            public static string GetClientIP()
            {
                string ipString = "";
                if (HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != null)
                {
                    ipString = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString();
                }
                else
                {
                    ipString = HttpContext.Current.Request.UserHostAddress;
                }
                return ipString;
            }
            
            //IPAccess类的方法在IsPopByIP中调用  将IP 地址转化为数字
            public static long IPtoNum(string Ip)
            {
                string[] stringip = new string[4];
                stringip = Ip.Split('.');
                long ipnum = Convert.ToInt64((stringip[0])) * 16777216 + Convert.ToInt64(stringip[1]) * 65536 + Convert.ToInt64(stringip[2]) * 256 + Convert.ToInt64(stringip[3]);
                return ipnum;
            }
    上面是代码,帮忙分析一下,多谢