3

サーバーリクエストを大陸ごとに地理的に特定しようとしています。

基本的に、いくつかの初期調査を行った後、3 つのアプローチがあるようです。2) IP アドレスのリストを取得し、そのリストをサーバー上のデータベースに配置し、リクエストが来るたびにこの DB から読み取ります。リクエストごとに DB にアクセスする必要はありません。3) 外部サーバーに HTTP 呼び出しを行い、場所を取得します。2) より遅くなる可能性もあります。

基本的に、ユーザーがどこにいるかを正確に知る必要はありません。ユーザーがどの大陸にいるのかを知る必要があるだけです: 北アメリカ、ヨーロッパ...

ユーザーの操作を必要とせず、リクエストごとに DB を読み取る必要がない方法はありますか? www.intel.com にアクセスすると、自動的にフランスのサイトにリダイレクトされます。彼らはどうやってそれをするのですか?

ご提案いただきありがとうございます。

4

3 に答える 3

7

どこから来ているか、IPからわかる無料のデータベースと商用のデータベースがいくつかあります。

maxmind の無料データベース [*]: http://dev.maxmind.com/geoip/geolite

および 2 つのコマーシャル:
http://www.ip2location.com
http://www.maxmind.com

このサイトでは、そのデータの使用方法に関する asp.net の例も見つけることができますが、使用できる他の無料サービスもあり、その使用がどこから来たのかを確認できます。

データベースと一緒に API サンプルを入手してください: http://www.maxmind.com/download/geoip/

国だけが必要な場合は、このデータベースファイル

http://www.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip

国のみが含まれており、残りの部分に比べて小さいです。

これがどのように機能するかを簡単に説明します。データベースの形式は次のとおりです。

"1.20.0.0","1.20.255.255","18087936","18153471","TH","Thailand"
"1.21.0.0","1.21.255.255","18153472","18219007","JP","Japan"
"1.22.0.0","1.23.255.255","18219008","18350079","IN","India"
"1.24.0.0","1.31.255.255","18350080","18874367","CN","China" 

長い数字は IP の翻訳です。したがって、ユーザーの IP を読み取り、関数を使用してそれを long に変換し、データベースを検索します。この long 番号はどこに適合しますか。

public long addrToNum(IPAddress Address)
{
    byte[] b = BitConverter.GetBytes(Address.Address);

    if (b.Length == 8)
        return (long)(((long)16777216 * b[0]) + ((long)(65536 * b[1])) + ((long)(256 * b[2])) + b[3]);
    else
        return 0;
}

したがって、それらをデータベースに追加すると、この長い数字でデータベースにインデックスを付け、次のように IP がどこにあるかを調べます。

Select TOP 1 * from GeoIPCountryWhois WITH (NOLOCK) Where @myIpToLong BETWEEN begin_num AND end_num

結果をセッション変数にキャッシュし、ページ要求ごとに何度も検索しないことをお勧めします。

[*] 今でもコマーシャルと共に無料のデータベースをリリースしている maxmind に感謝します。

于 2012-11-19T20:47:24.313 に答える
0

ファイアウォールへのアクセスを要求する前に、これを使用して IP アドレスを地理的に特定しました。これがあなたが探しているものかどうかはわかりませんが、役立つかもしれません。

http://www.geobytes.com/iplocator.htm

于 2012-11-19T20:41:33.467 に答える
0

2 番目のバリアントを好むようですが、リクエストごとに DB をヒットする必要はありません。たとえば、結果を Cookie にキャッシュするだけです。

そして、ちょっとした狂気 - 追加の DB リクエストのコストについて考えさせるために、必要に応じて geo-DB を変換できます (Aristos の回答を探してください)。すべての IP は Int64 に変換でき、DB を独自の形式に変換しながら大陸範囲を作成できます。たとえば、0 から 10000 は北米、10000 から 20000 はヨーロッパ、20000 から 30000 は北米などであり、このような変換後の唯一のタスクは、これらの範囲で IP を特定することです。

しかし、そのような変換を実行するには膨大な作業を行う必要があり、それを更新するのは非常に大きな問題になることを忘れないでください: IP ベースは一定ではありません。
したがって、DB リクエスト + キャッシングがおそらく最良の選択肢です。

于 2012-11-19T21:13:00.157 に答える