首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

C# 基於 QQWry.NET 實現 IP 歸屬地顯示:AJAX 異步查詢前台渲染完整案例

     編輯:ASP.NET 基礎

架構設計

  • 後台:IPSearch.ashx (IHttpHandler) 接收 IP 參數,調用 QQWryLocator 查詢,返回純文本「國家 地區」。
  • 前台:表格列表頁載入後,jQuery 遍歷 IP 欄,異步請求 Handler,替換單元格文本。

核心組件:QQWryLocator (精簡版)

public class QQWryLocator
{
    private readonly byte[] _data;
    private readonly int _firstOffset, _lastOffset, _count;
    private static readonly Encoding Gb2312 = Encoding.GetEncoding("GB2312");

    public QQWryLocator(string path)
    {
        _data = File.ReadAllBytes(path);
        _firstOffset = ReadInt32(0);
        _lastOffset = ReadInt32(4);
        _count = (_lastOffset - _firstOffset) / 7 + 1;
    }

    public IPLocation Query(string ip)
    {
        uint ipNum = IpToUInt(ip);
        // ... 二分查找邏輯同上 ...
        return new IPLocation { IP = ip, Country = country, Local = local };
    }
    // 輔助方法:ReadInt32, IpToUInt, ReadString, ParseRecord 等
}

HTTP Handler

public class IPSearch : IHttpHandler
{
    private static readonly QQWryLocator Locator = new QQWryLocator(HttpContext.Current.Server.MapPath("~/App_Data/QQWry.dat"));

    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "text/plain; charset=utf-8";
        string ip = context.Request["ip"];
        if (string.IsNullOrEmpty(ip)) { context.Response.Write("參數錯誤"); return; }

        var loc = Locator.Query(ip);
        context.Response.Write($"{loc.Country} {loc.Local}");
    }
    public bool IsReusable => true; // 無狀態,可復用
}

前台頁面

<table id="userTable">
    <thead><tr><th>用戶</th><th>金額</th><th>IP</th></tr></thead>
    <tbody>
        <tr><td>用戶A</td><td>100</td><td class="ip-cell">122.229.191.8</td></tr>
        <tr><td>用戶B</td><td>200</td><td class="ip-cell">110.87.98.30</td></tr>
    </tbody>
</table>

<script src="jquery-3.7.1.min.js"></script>
<script>
$(function () {
    $(".ip-cell").each(function () {
        var $cell = $(this);
        var ip = $cell.text().trim();
        $.get("IPSearch.ashx", { ip: ip }, function (data) {
            $cell.text(data).attr("title", ip); // 滑鼠懸停顯示原 IP
        });
    });
});
</script>

優化建議

  • 批量查詢 API:前台收集所有 IP,一次 POST 到 BatchSearch.ashx,返回 { "ip1": "loc1", "ip2": "loc2" },減少 HTTP 請求數。
  • 客戶端緩存:瀏覽器 localStorage 緩存 IP→地址映射,下次直接讀取。
  • 服務端緩存:MemoryCache 緩存熱點 IP 查詢結果,TTL 1 天。
  • 靜態化:報表導出時在服務端一次性解析所有 IP,生成最終 HTML,無需前台 AJAX。

總結

結合 QQWry.NET 高性能解析組件與 IHttpHandler 輕量級端點,配合 jQuery 異步渲染,可快速為舊系統添加 IP 歸屬地顯示功能。新系統建議採用批量 API + 緩存策略,或直接在服務端渲染完成。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved