ASP.NET MVC实现简单IP城市定位

序:最近重构公司网站项目时,需要重构一个功能,根据用户访问留下的IP为用户定位当前城市的内容。

话不多说,开始:

基本思路:

  1. 获取IP
  2. 发送GET请求到API
  3. 获取json
  4. 对象化(序列化)json
  5. 呈现地理位置

ok,可以开始动手去做了:

第一步:新建一个Helper类

我习惯把自己写的一些辅助方法放到MVC项目一个单独的Helpers目录下,每一类辅助器是一个class文件

右击Helpers目录-》新建cs文件-》LocHelper(表示定位类)

第二步:获取ip

//获取ip用
        public string GetIP()
        {
            string ip = string.Empty;
            if (!string.IsNullOrEmpty(System.Web.HttpContext.Current.Request.ServerVariables["HTTP_VIA"]))
                ip = Convert.ToString(System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]);
            if (string.IsNullOrEmpty(ip))
                ip = Convert.ToString(System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]);
            return ip;
        }

 

ip是从用户发送的头文件中截取的字符串,所以返回一个字符串

第三步:获取地址

        //获取地址信息,返回序列化的字符串(json)
        public string GetArea(string ip)
        {
            //api地址
            string url = "http://api.map.baidu.com/location/ip";
            //参数
            string param = "ip=" + ip + "&ak=" + Ak;
            string strURL = url + '?' + param;
            System.Net.HttpWebRequest request;
            request = (System.Net.HttpWebRequest)WebRequest.Create(strURL);
            request.Method = "GET";
            System.Net.HttpWebResponse response;
            response = (System.Net.HttpWebResponse)request.GetResponse();
            System.IO.Stream s;
            s = response.GetResponseStream();
            string StrDate = "";
            string strValue = "";
            StreamReader Reader = new StreamReader(s, Encoding.UTF8);
            while ((StrDate = Reader.ReadLine()) != null)
            {
                strValue += StrDate + "\r\n";
            }
            return strValue;
        }

 

该函数从百度获取了一个json字符串,使用时需要序列化

关于Ak:这是一个开发者秘钥,需要在百度申请,免费的,然后我们有可能会变更这个Ak,所以我干脆作为了一个类属性,我们需要使用这个Helper类前,new完先给Ak赋值,注意封装这个变量:

//百度秘钥
        private String ak;

        public string Ak
        {
            get
            {
                return ak;
            }

            set
            {
                ak = value;
            }
        }

 

提示:第二步,第三步不需要引入什么特别的包,如果提示红线,缺少引用,那么直接根据提示让vs为你添加

第四步:如何使用这个Helper?

例子:

 //获取地理位置
            if (Session["myCity"] == null)
            {
                var loc = new LocHelper();
                loc.Ak = "jGDGiHBTF4QSRQQVQdcUAUu1";
                var ip = loc.GetIP();
                if (ip == "127.0.0.1" || ip == "::1")
                    ip = "221.226.36.200";
                var areaJson = loc.GetArea(ip);
                var areaObj = JObject.Parse(areaJson);
                Session["myCity"] = areaObj["content"]["address_detail"]["city"];

            }
            string myCity = Session["myCity"].ToString();
            if (GswTblRegion.FirstOrDefault("where  OpenFlag=1 and CityName='" + myCity + "'") == null)
            {
                Session["myCity"] = "苏州市";
                myCity = "苏州市";
            }

 

如上所示:

  1. 先检查是否已经存在地理session,存在了就不去定位了,直接用
  2. 不存在就new一个刚刚的LocHelper类
  3. 先getIp,为防止本地ip百度返回错误报告,先过滤掉。
  4. 序列化(就是把json转化为对象)

关于如何序列化json字符串,需要引入一个包,这个包需要Nuget安装json.net:右击项目-》管理Nuget程序包-》搜索json.net-》下载安装即可

注意引用这三个命名空间:

using SunJob.Helpers;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

 

注意输出一下Session["city"],看看地址对不对

百度api json示例:

{  
        address: "CN|北京|北京|None|CHINANET|1|None",   #地址  
        content:       #详细内容  
        {  
        address: "北京市",   #简要地址  
        address_detail:      #详细地址信息  
        {  
        city: "北京市",        #城市  
        city_code: 131,       #百度城市代码  
        district: "",           #区县  
        province: "北京市",   #省份  
        street: "",            #街道  
        street_number: ""    #门址  
        },  
        point:               #百度经纬度坐标值  
        {  
        x: "116.39564504",  
        y: "39.92998578"  
        }  
        },  
        status: 0     #返回状态码  
    }
 

 

posted @ 2017-01-21 11:36  devilyouwei  阅读(543)  评论(0编辑  收藏  举报