Naylor 发表于 2016-11-30 15:17

ASP.NET MVC 获取客户端ip和对应的城市

【分享】

实现思路,先获取访问者ip,再通过ip调用淘宝API库,获取该ip所在的位置,即所在城市。

实体类:

/// <summary>
    /// 调用淘宝API,返回结果实体类
    /// </summary>
    public class TheModel
    {
      public int code { get; set; }
      public CityModel data { get; set; }
    }

    /// <summary>
    /// 城市实体类
    /// </summary>
    public class CityModel
    {
      public string country { get; set; }
      public string country_id { get; set; }
      public string area { get; set; }
      public string area_id { get; set; }
      public string region { get; set; }
      public string region_id { get; set; }
      public string city { get; set; }
      public string city_id { get; set; }
      public string county { get; set; }
      public string county_id { get; set; }
      public string isp { get; set; }
      public string isp_id { get; set; }
      public string ip { get; set; }
    }

控制器代码:

/// <summary>      
      /// 前台调用的接口
      /// *在局域网下是没法玩的,需自己设置theip的值。如: 219.142.153.240*
      /// </summary>
      /// <returns></returns>
      public JsonResult GetIPCity()
      {
            JsonResult json = new JsonResult();
            string theip = GetWebClientIp();
            string cityjson = GetstringIpAddress(theip);
            CityModel city = JsonConvert.DeserializeObject<TheModel>(cityjson).data;
            string thecity = city.country + city.city;
            json.Data = new { theip = theip, thecity = thecity };
            return json;
      }

      /// <summary>
      /// 获取客户端ip
      /// </summary>
      /// <returns></returns>
      private static string GetWebClientIp()
      {
            string userIP = "";
            try
            {
                if (System.Web.HttpContext.Current == null
            || System.Web.HttpContext.Current.Request == null
            || System.Web.HttpContext.Current.Request.ServerVariables == null)
                  return "";
                string CustomerIP = "";
                //CDN加速后取到的IP simone 090805
                CustomerIP = System.Web.HttpContext.Current.Request.Headers["Cdn-Src-Ip"];
                if (!string.IsNullOrEmpty(CustomerIP))
                {
                  return CustomerIP;
                }
                CustomerIP = System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
                if (!String.IsNullOrEmpty(CustomerIP))
                {
                  return CustomerIP;
                }
                if (System.Web.HttpContext.Current.Request.ServerVariables["HTTP_VIA"] != null)
                {
                  CustomerIP = System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
                  if (CustomerIP == null)
                        CustomerIP = System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
                }
                else
                {
                  CustomerIP = System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
                }
                if (string.Compare(CustomerIP, "unknown", true) == 0)
                  return System.Web.HttpContext.Current.Request.UserHostAddress;
                return CustomerIP;
            }
            catch { }
            return userIP;
      }

      /// <summary>
      /// 调用淘宝API获取城市信息
      /// </summary>
      /// <param name="strIP"></param>
      /// <returns></returns>
      public static string GetstringIpAddress(string theip) //strIP为IP
      {
            string theurl = "http://ip.taobao.com/service/getIpInfo.php?ip=" + theip + "";
            string result = string.Empty;
            System.Uri objurl = new System.Uri(theurl);
            System.Net.WebRequest objreq;
            System.Net.WebResponse objres;
            System.IO.StreamReader sr;
            try
            {
                objreq = System.Net.WebRequest.Create(objurl);
                objres = objreq.GetResponse();
                sr = new System.IO.StreamReader(objres.GetResponseStream());
                result = sr.ReadToEnd();
                sr.Close();
                objres.Close();
            }
            catch
            {

            }
            finally
            {
            }
            return result;
      }

吾爱丨破解 发表于 2016-11-30 15:23

我对你的头像比较感兴趣英文不好看不懂

a542013194 发表于 2016-11-30 15:34

来看头像的举爪{:17_1062:}

如花美眷 发表于 2016-11-30 15:34

虽然是非常基础的东西,还是给你一个支持吧、

慕克利Sera 发表于 2016-11-30 16:50

实质还是借别人的api呀

Naylor 发表于 2016-11-30 18:43

慕克利Sera 发表于 2016-11-30 16:50
实质还是借别人的api呀

对,至于那个api后面做了些什么,说实话,我真不知道。但是这个思路能满足大部分企业级项目的要求了。

MartinLee 发表于 2016-11-30 18:48

太需要了!!!!先回复,收藏

MartinLee 发表于 2016-11-30 18:50

不用MVC框架获取客户端ip和对应城市怎么做呢,还有页面关闭时记录时间等怎么写入数据库啊

Naylor 发表于 2016-12-10 16:25

MartinLee 发表于 2016-11-30 18:50
不用MVC框架获取客户端ip和对应城市怎么做呢,还有页面关闭时记录时间等怎么写入数据库啊

“不用MVC怎么做”我不知道你的疑惑在那里?用不用MVC其实没有关系,都是C#的代码,只要是.NET的环境都是可以用的!页面关闭是一个事件,你先想办法捕捉到这个事件,然后在这个事件中写一个函数来访问服务器,在服务器端获取当前时间并且记录到数据库。

liuyuntianxia12 发表于 2017-7-10 10:14

实话说,根据IP的归属判断所在城市很不准确,例如我在武汉,我使用改的电信网络显示的是在襄阳...
页: [1] 2
查看完整版本: ASP.NET MVC 获取客户端ip和对应的城市