---
title: "位置情報データの取得"
slug: "retrieve-geolocation-data"
abstract: "GeoIP APIを使って、インタラクションやIPアドレスから位置情報を取得する方法。"
---
# 位置情報データの取得

Sitecoreは、ジオロケーション(GeoIP)データを処理するためのAPIサービスを提供しています。例えば、リクエストのIPアドレスから都市、国、地域を取得することが可能です。

トラッカー APIは、Sitecore.Analytics.Tracker.Current.Interaction.GeoDataプロパティの助けを借りて現在のやり取りに関するGeoIPデータへのアクセスを提供します。例えば、以下のコードを使って現在のやり取りの国を取得することができます:

var country = Sitecore.Analytics.Tracker.Current.Interaction.GeoData.Country;

特定のIPアドレスの位置情報データを取得することもできます。この目的には2つの方法があります。

-   Sitecore.DependencyInjection.ServiceLocator.ServiceProvider.GetRequiredService<Sitecore.CES.GeoIp.Core.IGeoIpManager>().GetGeoIpData(...)
-   Sitecore.CES.GeoIp.Core.Lookups.LookupManager.GetWhoIsInformationByIp(...)

## GeoIPManagerサービス

GeoIPManagerサービスという公開APIを使って、特定のIPアドレスのGeoIPデータを取得します:

Sitecore.CES.GeoIp.Core.IGeoIpManager.GetGeoIpData(string ipAddress,TimeSpan? timeout = null)

> !注このトピックで言及されたすべての設定設定は<wwwroot>\\App\_Config\\Sitecore\\ DetectionServices.Location\\ Sitecore.CES.GeoIp.config設定ファイルに含まれています。

特定のIPアドレスのAPIを呼び出すと、以下の順番でGeoIPデータの存在を確認します。

1.  メモリキャッシュ
2.  データベースについて
3.  ジオロケーションサービス

結果が見つかると、それ以上は調査しません。以下のセクションでは、各位置をどのようにチェックするかを詳しく説明します。

### メモリキャッシュ

ここでAPIは指定されたIPアドレスのGeoIPデータを最初に検索します。2つの設定設定で、キャッシュのサイズと各IPアドレスのデータがキャッシュにどれくらい長く残るかが指定されています。

<setting name="CES.GeoIp.Caching.GeoIpCacheExpiryTime" value="\`1:00\`:\`00:00\`"/>
<setting name="CES.GeoIp.Caching.GeoIpCacheSize" value="5MB"/>

### データベースについて

VisitGeoIpDataのテーブルは暗号化されたIPアドレスと関連するGeoIPデータを格納します。設定で以下のことを指定できます:

-   GeoIPデータの寿命:テーブル内のレコードのデフォルトの有効期限は挿入後1年です。<setting name="CES.GeoIp.Database.MaxEntryLifetime" value="365:00:00:00">設定で別の時刻を指定することもできます。
-   使用データベース:デフォルトで使われるデータベースはWebですが、<setting name="CES.GeoIp.ConnectionName" value="web">設定で別のデータベースを指定することもできます。connectionstring.configファイル内で定義された任意のデータベースを指定できます。データベースは読み書き操作をサポートし、VisitGeoIpテーブルを含む必要があります。
-   クリーンアップエージェント:エージェントは実行時に期限切れのレコードを消去します。デフォルトでは1日に1回実行されます。<agent type="Sitecore.CES.GeoIp.Core.Database.CleanupAgent, Sitecore.CES.GeoIp.Core" method="Run" interval="24:00の設定設定で別の周波数:00" async="true" resolve="true">指定できます。

また、アクティブジオレプリケーションの設定も可能で、読み取り専用のレプリケートデータベースを使用します。

-   <setting name="CES.GeoIp.ConnectionName" value="read-only database name">設定で読み取り専用データベースを指定します。
-   <setting name="CES.GeoIp.ConnectionName.Writable" value="writable database name ">設定で書き込み可能なデータベースを指定します。

両方のデータベースにはVisitGeoIpDataテーブルが含まれていなければなりません。

> !注実際にアクティブなジオレプリケーションを使うときだけCES.GeoIp.ConnectionName.Writable指定してください。使わない場合は、この値を空欄のままにしてください。

### ジオロケーションサービス

APIは、メモリキャッシュもデータベースにも求めるデータがない場合、最後のステップとしてジオロケーションサービスを使用します。特定のIPアドレスの結果を受け取ると、その結果をデータベースに保存し、メモリキャッシュにも追加します。

## GeoIPManagerServiceの使用

以下の例は、Sitecore.CES.GeoIp.Core.IGeoIpManagerAPIを使って特定のIPアドレスの国を解析する方法を示しています:  

using Microsoft.Extensions.DependencyInjection;
using Sitecore.CES.GeoIp.Core;
using Sitecore.CES.GeoIp.Core.Model;
using Sitecore.DependencyInjection;
public string GetCountryByIp(string ipAddress)
{
 try
 {
 var country = string.Empty;

 var geoIpManager = ServiceLocator.ServiceProvider.GetRequiredService<IGeoIpManager>();

 var geoIpFetchedData = geoIpManager.GetGeoIpData(ipAddress);

 if (geoIpFetchedData.Status == GeoIpFetchDataStatus.Fetched && geoIpFetchedData.WhoIsInformation != null)
 {
 country = geoIpFetchedData.WhoIsInformation.Country;
 }
 }
 catch (Exception)
 {
 // Handle the exceptions
 }
 return country;
}

GetGeoIpDataメソッドにはTimeSpan timeoutというオプションパラメータがあります。これはメソッドがデータを解決するまでの待ち時間を指定します。メソッドが指定された時間内にデータを取得できない場合、プロセスはUnknown Ip Address with Timeout statusを返し、バックグラウンドで継続します。これにより、データ解決に時間がかかりすぎる場合にメソッドがリクエストをブロックするのを防ぎます。このパラメータをメソッドに渡さない場合、メソッドはCES.GeoIp.LookupRequestTimeoutで指定された値を使います。タイムアウトを数秒以内に設定することをお勧めします。これにより、データ解決の遅延が発生した際にページ読み込みに余計な実行時間が加わらないようにするためです。

タイムアウトをTimeSpan.Maxに設定すると、メソッドはサービスからの返信を永遠に待ち続けます。

APIはSitecore.CES.GeoIp.Core.Model.GeoIpFetchedData型のオブジェクトを返します。このオブジェクトにはSitecore.CES.GeoIp.Core.Model.GeoIpFetchDataStatusの結果の状態とジオデータの結果が含まれています。ステータス値は以下のいずれかです:

-   Fetched:無事完了
-   Timeout:まだ完了しておらず、タイムアウトのため戻ってきました
-   Unknown:IPアドレスは不明です
-   Disabled:APIが無効化されています
-   Invalid: 提供されたIPアドレスは無効です
-   Failed: APIがエラーに遭遇し失敗しました

## GetWhoIsInformationByIp API

このAPIは後のバージョンで削除されますが、現時点では後方互換性のために存在しています。内部的にはGeoIpManagerサービスを呼び出します。