zoukankan      html  css  js  c++  java
  • 获取客户端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
        }
    View Code

    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
        }
    View Code

    3:调用

    在需要用到的地方直接调用此方法即可
    var Ip=Net.GetIP;

  • 相关阅读:
    Spring框架概念
    git stash 用法总结和注意点
    Java虚拟机:对象创建过程与类加载机制、双亲委派模型
    办公软件技巧
    Zookeeper到底是干嘛的
    ANdroid Studio下载
    node.js网络(net)
    显示日期
    打包apk

  • 原文地址:https://www.cnblogs.com/romanticcrystal/p/12653106.html
Copyright © 2011-2022 走看看