LOGO 首页 OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 技术文档 其他文档  
 
网站管理员

C#.Net 根据IP地址解析所属的国家省市县代码


2026年9月17日 2:55 本文热度 182
C#.Net 根据IP地址解析所属的国家省市县代码

using System;

using System.Web;

using System.Net;

using System.Text;


public class IpLocationHandler : IHttpHandler

{

    // 核心函数:传入IP,返回【国家+省+市+县】,内网直接返回 局域网IP地址

    public string getIPAddress(string ip)

    {

        if (IsLocalIp(ip))

        {

            return "局域网IP地址";

        }


        string url = string.Format("https://ip9.com.cn/get?ip={0}", HttpUtility.UrlEncode(ip));

        HttpWebRequest request = null;

        HttpWebResponse response = null;

        try

        {

            // 兼容 .NET4.0,使用数字常量开启TLS1.2,解决未能创建SSL/TLS安全通道

            ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;


            request = (HttpWebRequest)WebRequest.Create(url);

            request.Timeout = 3000;      //3秒超时

            request.ReadWriteTimeout = 3000;

            request.Method = "GET";

            request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64)";


            response = (HttpWebResponse)request.GetResponse();

            using (var sr = new System.IO.StreamReader(response.GetResponseStream(), Encoding.UTF8))

            {

                string respText = sr.ReadToEnd();

                string country = GetJsonValue(respText, "country");

                string province = GetJsonValue(respText, "province");

                string city = GetJsonValue(respText, "city");

                string district = GetJsonValue(respText, "district");


                StringBuilder sb = new StringBuilder();

                if (!string.IsNullOrEmpty(country)) sb.Append(country);

                if (!string.IsNullOrEmpty(province)) sb.Append(province);

                if (!string.IsNullOrEmpty(city)) sb.Append(city);

                if (!string.IsNullOrEmpty(district)) sb.Append(district);

                return sb.ToString().Trim();

            }

        }

        catch (Exception ex)

        {

            //调试模式:返回错误信息,上线改为 return "未知地址";

            return string.Format("【ERROR】{0}", ex.ToString());

        }

        finally

        {

            if (response != null) response.Close();

            if (request != null) request.Abort();

        }

    }


    /// <summary>

    /// 判断内网IP

    /// </summary>

    private bool IsLocalIp(string ipStr)

    {

        IPAddress ip;

        if (!IPAddress.TryParse(ipStr, out ip))

            return false;


        byte[] ipBytes = ip.GetAddressBytes();

        //10.0.0.0/8

        if (ipBytes[0] == 10) return true;

        //172.16.0.0/12

        if (ipBytes[0] == 172 && ipBytes[1] >= 16 && ipBytes[1] <= 31) return true;

        //192.168.0.0/16

        if (ipBytes[0] == 192 && ipBytes[1] == 168) return true;

        //回环地址

        if (IPAddress.IsLoopback(ip)) return true;

        return false;

    }


    /// <summary>

    /// 简易提取JSON字段,无第三方依赖

    /// </summary>

    private string GetJsonValue(string json, string key)

    {

        string searchKey = string.Format("\"{0}\":", key);

        int idx = json.IndexOf(searchKey);

        if (idx < 0) return "";


        int start = idx + searchKey.Length;

        if (start >= json.Length) return "";


        char startChar = json[start];

        int end;


        if (startChar == '"')

        {

            start++;

            end = json.IndexOf('"', start);

        }

        else

        {

            end = json.IndexOf(',', start);

            if (end < 0) end = json.IndexOf('}', start);

        }

        if (end < 0 || end > json.Length) return "";

        return json.Substring(start, end - start).Trim();

    }


    public void ProcessRequest(HttpContext context)

    {

        context.Response.ContentType = "text/plain";

        string ip = context.Request.QueryString["ip"] ?? "";

        string location = getIPAddress(ip);

        context.Response.Write(location);

    }


    public bool IsReusable

    {

        get { return true; }

    }

}

补充说明

  1. 数字 3072 = TLS1.2,这个写法兼容 .NET Framework4.0,不会报枚举不存在编译错误;

  2. 服务器操作系统(Windows Server 2008 R2)需要系统层面支持 TLS1.2,如果系统没打补丁,就算代码写了也会继续报 SSL 通道错误,需要安装 Windows 系统补丁。

  3. 调试完成上线时,把 catch 里面代码替换为:

catch (Exception ex)

{

    return "未知地址";

}


该文章在 2026/9/17 11:11:55 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2026 ClickSun All Rights Reserved  粤ICP备13012886号-2  粤公网安备44030602007207号