ASP.NET MVC实现简单IP城市定位
序:最近重构公司网站项目时,需要重构一个功能,根据用户访问留下的IP为用户定位当前城市的内容。
话不多说,开始:
基本思路:
- 获取IP
- 发送GET请求到API
- 获取json
- 对象化(序列化)json
- 呈现地理位置
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 = "苏州市"; }
如上所示:
- 先检查是否已经存在地理session,存在了就不去定位了,直接用
- 不存在就new一个刚刚的LocHelper类
- 先getIp,为防止本地ip百度返回错误报告,先过滤掉。
- 序列化(就是把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 #返回状态码 }