获取客户端IP和归属地
Posted romanticcrystal
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了获取客户端IP和归属地相关的知识,希望对你有一定的参考价值。
1:新建一个Net.cs类
/// <summary> /// 网络操作 /// </summary> public class Net { #region Ip(获取Ip) /// <summary> /// 获取Ip /// </summary> public static string Ip { get { var result = string.Empty; if (HttpContext.Current != null) result = GetWebClientIp(); if (string.IsNullOrEmpty(result)) result = GetLanIp(); return result; } } /// <summary> /// ===调用方法=== /// 直接调用此方法可获取IP /// </summary> public static string GetIP { get { string Ip = Net.Ip; string Location = Net.GetLocation(Net.Ip); return string.Format("IP:{0}; {1};", Ip, Location); } } /// <summary> /// 获取Web客户端的Ip /// </summary> private static string GetWebClientIp() { var ip = GetWebRemoteIp(); foreach (var hostAddress in Dns.GetHostAddresses(ip)) { if (hostAddress.AddressFamily == AddressFamily.InterNetwork) return hostAddress.ToString(); } return string.Empty; } /// <summary> /// 获取Web远程Ip /// </summary> private static string GetWebRemoteIp() { return HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] ?? HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; } /// <summary> /// 获取局域网IP /// </summary> private static string GetLanIp() { foreach (var hostAddress in Dns.GetHostAddresses(Dns.GetHostName())) { if (hostAddress.AddressFamily == AddressFamily.InterNetwork) return hostAddress.ToString(); } return string.Empty; } #endregion #region Host(获取主机名) /// <summary> /// 获取主机名 /// </summary> public static string Host { get { return HttpContext.Current == null ? Dns.GetHostName() : GetWebClientHostName(); } } /// <summary> /// 获取Web客户端主机名 /// </summary> private static string GetWebClientHostName() { if (!HttpContext.Current.Request.IsLocal) return string.Empty; var ip = GetWebRemoteIp(); var result = Dns.GetHostEntry(IPAddress.Parse(ip)).HostName; if (result == "localhost.localdomain") result = Dns.GetHostName(); return result; } #endregion #region 获取mac地址 /// <summary> /// 返回描述本地计算机上的网络接口的对象(网络接口也称为网络适配器)。 /// </summary> /// <returns></returns> public static NetworkInterface[] NetCardInfo() { return NetworkInterface.GetAllNetworkInterfaces(); } ///<summary> /// 通过NetworkInterface读取网卡Mac ///</summary> ///<returns></returns> public static List<string> GetMacByNetworkInterface() { List<string> macs = new List<string>(); NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces(); foreach (NetworkInterface ni in interfaces) { macs.Add(ni.GetPhysicalAddress().ToString()); } return macs; } #endregion #region Ip城市(获取Ip城市) /// <summary> /// 获取IP地址信息 /// </summary> /// <param name="ip">ip地址</param> /// <param name="AppKey">配置文件中的AppKey</param> /// 查阅了很多资料,都是通过第三方获取的ip信息 /// 这里提供两个平台 /// 1:聚合数据(免费) /// 2:百度 /// <returns></returns> public static string GetLocation(string ip) { string res = ""; //try //{ // string AppKey = Configs.GetValue("IpAppKey");//获取配置文件中的AppKey值 // string url = string.Format("http://apis.juhe.cn/ip/ip2addr?ip={0}&dtype=json&key={1}", ip, AppKey); // res = HttpMethods.HttpGet(url); // var resjson = res.ToObject<objex>(); // res = resjson.result.area + " " + resjson.result.location; //} //catch //{ // res = ""; //} //if (!string.IsNullOrEmpty(res)) //{ // return res; //} try { string url = "https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?query=" + ip + "&resource_id=6006&ie=utf8&oe=gbk&format=json"; res = HttpMethods.HttpGet(url, Encoding.GetEncoding("GBK")); var resjson = JsonConvert.DeserializeObject<obj>(res); res = resjson.data[0].location; } catch { res = "err"; } return res; } /// <summary> /// 百度接口 /// </summary> public class obj { public List<dataone> data { get; set; } } public class dataone { public string location { get; set; } } /// <summary> /// 聚合数据 /// </summary> public class objex { public string resultcode { get; set; } public dataoneex result { get; set; } public string reason { get; set; } public string error_code { get; set; } } public class dataoneex { public string area { get; set; } public string location { get; set; } } #endregion #region Browser(获取浏览器信息) /// <summary> /// 获取浏览器信息 /// </summary> public static string Browser { get { if (HttpContext.Current == null) return string.Empty; var browser = HttpContext.Current.Request.Browser; return string.Format("{0} {1}", browser.Browser, browser.Version); } } #endregion }
2:添加类,上面出现的HttpMethods.cs类
public class HttpMethods { #region POST /// <summary> /// HTTP POST方式请求数据 /// </summary> /// <param name="url">URL.</param> /// <param name="param">POST的数据</param> /// <returns></returns> public static string HttpPost(string url, string param = null) { HttpWebRequest request; //如果是发送HTTPS请求 if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) { ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult); request = WebRequest.Create(url) as HttpWebRequest; request.ProtocolVersion = HttpVersion.Version10; } else { request = WebRequest.Create(url) as HttpWebRequest; } request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; request.Accept = "*/*"; request.Timeout = 15000; request.AllowAutoRedirect = false; StreamWriter requestStream = null; WebResponse response = null; string responseStr = null; try { requestStream = new StreamWriter(request.GetRequestStream()); requestStream.Write(param); requestStream.Close(); response = request.GetResponse(); if (response != null) { StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8); responseStr = reader.ReadToEnd(); reader.Close(); } } catch (Exception) { throw; } finally { request = null; requestStream = null; response = null; } return responseStr; } private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { return true; //总是接受 } public static string BuildRequest(string strUrl, Dictionary<string, string> dicPara, string fileName) { string contentType = "image/jpeg"; //待请求参数数组 FileStream Pic = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); byte[] PicByte = new byte[Pic.Length]; Pic.Read(PicByte, 0, PicByte.Length); int lengthFile = PicByte.Length; //构造请求地址 //设置HttpWebRequest基本信息 HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(strUrl); //设置请求方式:get、post request.Method = "POST"; //设置boundaryValue string boundaryValue = DateTime.Now.Ticks.ToString("x"); string boundary = "--" + boundaryValue; request.ContentType = " multipart/form-data; boundary=" + boundaryValue; //设置KeepAlive request.KeepAlive = true; //设置请求数据,拼接成字符串 StringBuilder sbhtml = new StringBuilder(); foreach (KeyValuePair<string, string> key in dicPara) { sbHtml.Append(boundary + " Content-Disposition: form-data; name="" + key.Key + "" " + key.Value + " "); } sbHtml.Append(boundary + " Content-Disposition: form-data; name="pic"; filename=""); sbHtml.Append(fileName); sbHtml.Append("" Content-Type: " + contentType + " "); string postHeader = sbHtml.ToString(); //将请求数据字符串类型根据编码格式转换成字节流 Encoding code = Encoding.GetEncoding("UTF-8"); byte[] postHeaderBytes = code.GetBytes(postHeader); byte[] boundayBytes = Encoding.ASCII.GetBytes(" " + boundary + "-- "); //设置长度 long length = postHeaderBytes.Length + lengthFile + boundayBytes.Length; request.ContentLength = length; //请求远程HTTP Stream requestStream = request.GetRequestStream(); Stream myStream = null; try { //发送数据请求服务器 requestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length); requestStream.Write(PicByte, 0, lengthFile); requestStream.Write(boundayBytes, 0, boundayBytes.Length); HttpWebResponse HttpWResp = (HttpWebResponse)request.GetResponse(); myStream = HttpWResp.GetResponseStream(); } catch (WebException e) { //LogResult(e.Message); return ""; } finally { if (requestStream != null) { requestStream.Close(); } } //读取处理结果 StreamReader reader = new StreamReader(myStream, code); StringBuilder responseData = new StringBuilder(); String line; while ((line = reader.ReadLine()) != null) { responseData.Append(line); } myStream.Close(); Pic.Close(); return responseData.ToString(); } #endregion #region Put /// <summary> /// HTTP Put方式请求数据. /// </summary> /// <param name="url">URL.</param> /// <returns></returns> public static string HttpPut(string url, string param = null) { HttpWebRequest request; //如果是发送HTTPS请求 if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) { ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult); request = WebRequest.Create(url) as HttpWebRequest; request.ProtocolVersion = HttpVersion.Version10; } else { request = WebRequest.Create(url) as HttpWebRequest; } request.Method = "PUT"; request.ContentType = "application/x-www-form-urlencoded"; request.Accept = "*/*"; request.Timeout = 15000; request.AllowAutoRedirect = false; StreamWriter requestStream = null; WebResponse response = null; string responseStr = null; try { requestStream = new StreamWriter(request.GetRequestStream()); requestStream.Write(param); requestStream.Close(); response = request.GetResponse(); if (response != null) { StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8); responseStr = reader.ReadToEnd(); reader.Close(); } } catch (Exception) { throw; } finally { request = null; requestStream = null; response = null; } return responseStr; } #endregion #region Delete /// <summary> /// HTTP Delete方式请求数据. /// </summary> /// <param name="url">URL.</param> /// <returns></returns> public static string HttpDelete(string url, string param = null) { HttpWebRequest request; //如果是发送HTTPS请求 if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) { ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult); request = WebRequest.Create(url) as HttpWebRequest; request.ProtocolVersion = HttpVersion.Version10; } else { request = WebRequest.Create(url) as HttpWebRequest; } request.Method = "Delete"; request.ContentType = "application/x-www-form-urlencoded"; request.Accept = "*/*"; request.Timeout = 15000; request.AllowAutoRedirect = false; StreamWriter requestStream = null; WebResponse response = null; string responseStr = null; try { requestStream = new StreamWriter(request.GetRequestStream()); requestStream.Write(param); requestStream.Close(); response = request.GetResponse(); if (response != null) { StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8); responseStr = reader.ReadToEnd(); reader.Close(); } } catch (Exception) { throw; } return responseStr; } #endregion #region Get /// <summary> /// HTTP GET方式请求数据. /// </summary> /// <param name="url">URL.</param> /// <returns></returns> public static string HttpGet(string url, Hashtable headht = null) { HttpWebRequest request; //如果是发送HTTPS请求 if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) { ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult); request = WebRequest.Create(url) as HttpWebRequest; request.ProtocolVersion = HttpVersion.Version10; } else { request = WebRequest.Create(url) as HttpWebRequest; } request.Method = "GET"; //request.ContentType = "application/x-www-form-urlencoded"; request.Accept = "*/*"; request.Timeout = 15000; request.AllowAutoRedirect = false; WebResponse response = null; string responseStr = null; if (headht != null) { foreach (DictionaryEntry item in headht) { request.Headers.Add(item.Key.ToString(), item.Value.ToString()); } } try { response = request.GetResponse(); if (response != null) { StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8); responseStr = reader.ReadToEnd(); reader.Close(); } } catch (Exception) { throw; } return responseStr; } public static string HttpGet(string url, Encoding encodeing, Hashtable headht = null) { HttpWebRequest request; //如果是发送HTTPS请求 if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) { ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult); request = WebRequest.Create(url) as HttpWebRequest; request.ProtocolVersion = HttpVersion.Version10; } else { request = WebRequest.Create(url) as HttpWebRequest; } request.Method = "GET"; //request.ContentType = "application/x-www-form-urlencoded"; request.Accept = "*/*"; request.Timeout = 15000; request.AllowAutoRedirect = false; WebResponse response = null; string responseStr = null; if (headht != null) { foreach (DictionaryEntry item in headht) { request.Headers.Add(item.Key.ToString(), item.Value.ToString()); } } try { response = request.GetResponse(); if (response != null) { StreamReader reader = new StreamReader(response.GetResponseStream(), encodeing); responseStr = reader.ReadToEnd(); reader.Close(); } } catch (Exception) { throw; } return responseStr; } #endregion #region Post With Pic private string HttpPost(string url, IDictionary<object, object> param, string filePath) { string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x"); byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes(" --" + boundary + " "); HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url); wr.ContentType = "multipart/form-data; boundary=" + boundary; wr.Method = "POST"; wr.KeepAlive = true; wr.Credentials = System.Net.CredentialCache.DefaultCredentials; Stream rs = wr.GetRequestStream(); string responseStr = null; string formdataTemplate = "Content-Disposition: form-data; name="{0}" {1}"; foreach (string key in param.Keys) { rs.Write(boundarybytes, 0, boundarybytes.Length); string formitem = string.Format(formdataTemplate, key, param[key]); byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem); rs.Write(formitembytes, 0, formitembytes.Length); } rs.Write(boundarybytes, 0, boundarybytes.Length); string headerTemplate = "Content-Disposition: form-data; name="{0}"; filename="{1}" Content-Type: {2} "; string header = string.Format(headerTemplate, "pic", filePath, "text/plain"); byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header); rs.Write(headerbytes, 0, headerbytes.Length); FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read); byte[] buffer = new byte[4096]; int bytesRead = 0; while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0) { rs.Write(buffer, 0, bytesRead); } fileStream.Close(); byte[] trailer = System.Text.Encoding.ASCII.GetBytes(" --" + boundary + "-- "); rs.Write(trailer, 0, trailer.Length); rs.Close(); WebResponse wresp = null; try { wresp = wr.GetResponse(); Stream stream2 = wresp.GetResponseStream(); StreamReader reader2 = new StreamReader(stream2); responseStr = reader2.ReadToEnd(); //logger.Debug(string.Format("File uploaded, server response is: {0}", responseStr)); } catch (Exception ex) { //logger.Error("Error uploading file", ex); if (wresp != null) { wresp.Close(); wresp = null; } throw; } return responseStr; } #endregion #region Post With Pic /// <summary> /// HTTP POST方式请求数据(带图片) /// </summary> /// <param name="url">URL</param> /// <param name="param">POST的数据</param> /// <param name="fileByte">图片</param> /// <returns></returns> public static string HttpPost(string url, IDictionary<object, object> param, byte[] fileByte) { string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x"); byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes(" --" + boundary + " "); HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url); wr.ContentType = "multipart/form-data; boundary=" + boundary; wr.Method = "POST"; wr.KeepAlive = true; wr.Credentials = System.Net.CredentialCache.DefaultCredentials; Stream rs = wr.GetRequestStream(); string responseStr = null; string formdataTemplate = "Content-Disposition: form-data; name="{0}" {1}"; foreach (string key in param.Keys) { rs.Write(boundarybytes, 0, boundarybytes.Length); string formitem = string.Format(formdataTemplate, key, param[key]); byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem); rs.Write(formitembytes, 0, formitembytes.Length); } rs.Write(boundarybytes, 0, boundarybytes.Length); string headerTemplate = "Content-Disposition: form-data; name="{0}"; filename="{1}" Content-Type: {2} "; string header = string.Format(headerTemplate, "pic", fileByte, "text/plain");//image/jpeg byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header); rs.Write(headerbytes, 0, headerbytes.Length); rs.Write(fileByte, 0, fileByte.Length); byte[] trailer = System.Text.Encoding.ASCII.GetBytes(" --" + boundary + "-- "); rs.Write(trailer, 0, trailer.Length); rs.Close(); WebResponse wresp = null; try { wresp = wr.GetResponse(); Stream stream2 = wresp.GetResponseStream(); StreamReader reader2 = new StreamReader(stream2); responseStr = reader2.ReadToEnd(); // logger.Error(string.Format("File uploaded, server response is: {0}", responseStr)); } catch (Exception ex) { //logger.Error("Error uploading file", ex); if (wresp != null) { wresp.Close(); wresp = null; } throw; } return responseStr; } #endregion }
3:调用
在需要用到的地方直接调用此方法即可
var Ip=Net.GetIP;
以上是关于获取客户端IP和归属地的主要内容,如果未能解决你的问题,请参考以下文章