• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
思想人生从关注生活开始
博客园    首页    新随笔    联系   管理    订阅  订阅

Sitecore 8.2的自定义地理IP位置服务

如果您出于某种原因不想使用Geo IP的默认Sitecore提供程序,那么有一种方法可以实现您自己的自定义Geo IP提供程序。

大家都知道Sitecore为Geo IP位置提供服务。为了能够使用它,您需要购买额外的订阅。但是,如果您由于某种原因不想使用Geo IP的默认Sitecore提供程序,则有一种方法可以实现您自己的自定义Geo IP提供程序。
根据我一直在研究的内容,我发现了两种可以免费提供Geo IP查找的服务:

  • http://freegeoip.net
  • http://ip-api.com

Helpfulcore.GeoIp

我尝试使用两者并分享Sitecore模块,该模块可以简单地作为nuget包集成到Sitecore解决方案中。
请在github上找到这个项目https://github.com/vhil/Helpfulcore-GeoIp 
它可以在nuget中找到。要安装有用的核心.GeoIp,请在程序包管理器控制台中运行以下命令

1
Install-Package Helpfulcore.GeoIp

架构和可扩展性

该模块完全由配置驱动,因此所有依赖关系管理都通过简单的include配置文件进行。
为了使其可扩展,我实现了GeoIpLookupProvider类,它继承了默认的Sitecore LookupProviderBase类,并为它创建了一个构造函数,它接受了检索器对象和数据适配器对象,所以它很容易实现任何新的检索器,然后定义检索数据的方式必须是适用于Sitecore用作商业模式的WhoisInformation对象。
所以关键的抽象看起来像这样:
猎犬:

1
2
3
4
public interface IGeoIpLocationRetriever
{
    IGeoIpResponse GetInformationByIp(string ip);
}

适配器:

1
2
3
4
public interface IGeoIpDataAdapter
{
    WhoIsInformation Adapt(IGeoIpResponse providerObject);
}

查找提供者:

1
2
3
4
五
6
7
8
9
10
11
public class GeoIpLookupProvider : LookupProviderBase
{
    //...
    public GeoIpLookupProvider(
        IGeoIpLocationRetriever geoIpLocationRetriever,
        IGeoIpDataAdapter geoIpDataAdapter,
        ILoggingService logger)
    {
        // ...
    }
}

因此原理很简单,GeoIpLookupProvider调用IGeoIpLocationRetriever从您实现的任何服务中获取数据,然后尝试使用IGeoIpDataAdapter将其调整为Sitecore使用的WhoIsInformation类型的目标对象。
Helpfulcore.GeoIp模块提供专用的包含配置文件

1
\App_Config\Include\Helpfulcore\Helpfulcore.GeoIp.config

使用下一个配置:

1
2
3
4
五
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
三十
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<?xml version="1.0" encoding="utf-8" ?>
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
  <sitecore>
    <helpfulcore>
      <geoIp>
        <!--Free Geo IP-->
        <freeGeoIpRetriever type="Helpfulcore.GeoIp.FreeGeoIpNet.FreeGeoIpNetRetriever, Helpfulcore.GeoIp">
          <param name="serviceEndpoint">http://freegeoip.net/xml/</param>
          <param name="logger" ref="helpfulcore/geoIp/loggingService"/>
        </freeGeoIpRetriever>
        <freeGeoIpAdapter type="Helpfulcore.GeoIp.FreeGeoIpNet.FreeGeoIpDataAdapter, Helpfulcore.GeoIp" />
        <!--Ip Api Com-->
        <ipApiComRetriever type="Helpfulcore.GeoIp.IpApiCom.IpApiComRetriever, Helpfulcore.GeoIp">
          <param name="serviceEndpoint">http://ip-api.com/json/</param>
          <param name="logger" ref="helpfulcore/geoIp/loggingService"/>
        </ipApiComRetriever>
        <ipApiComAdapter type="Helpfulcore.GeoIp.IpApiCom.IpApiComDataAdapter, Helpfulcore.GeoIp" />
        <!--Logger-->
        <loggingService type="Helpfulcore.Logging.LoggingService, Helpfulcore.Logging" singleInstance="true" >
          <param name="provider" ref="helpfulcore/geoIp/logProviders/debugLogFileProvider"/>
        </loggingService>
        <logProviders>
          <debugLogFileProvider type="Helpfulcore.Logging.NLog.NLogLoggingProvider, Helpfulcore.Logging.NLog" logFilePath="$(dataFolder)/logs/Helpfulcore.GeoIp.log.${date:format=yyyyMMdd}.txt" singleInstance="true">
            <param name="filePath">$(logFilePath)</param>
            <LogLevel>Debug</LogLevel>
          </debugLogFileProvider>
        </logProviders>
      </geoIp>
    </helpfulcore>
    <lookupManager>
      <patch:delete/>
    </lookupManager>
    <lookupManager defaultProvider="default">
      <providers>
        <clear/>
        <add name="default" type="Helpfulcore.GeoIp.GeoIpLookupProvider, Helpfulcore.GeoIp">
          <param name="geoIpLocationRetriever" ref="helpfulcore/geoIp/ipApiComRetriever" />
          <param name="geoIpDataAdapter" ref="helpfulcore/geoIp/ipApiComAdapter" />
          <param name="logger" ref="helpfulcore/geoIp/loggingService" />
        </add>
        <!--<add name="freeGeoIp" type="Helpfulcore.GeoIp.GeoIpLookupProvider, Helpfulcore.GeoIp">
          <param name="geoIpLocationRetriever" ref="helpfulcore/geoIp/freeGeoIpRetriever" />
          <param name="geoIpDataAdapter" ref="helpfulcore/geoIp/freeGeoIpAdapter" />
          <param name="logger" ref="helpfulcore/geoIp/loggingService" />
        </add>-->
      </providers>
    </lookupManager>
    <!--Override IP on local environment if required-->
    <!--<pipelines>
      <startTracking>
        <processor type="Helpfulcore.GeoIp.OverrideIpAddress, Helpfulcore.GeoIp" patch:before="*[@type='Sitecore.Analytics.Pipelines.StartTracking.UpdateGeoIpData, Sitecore.Analytics']">
          <param name="ipAddress">213.242.89.104</param>
          <param name="logger" ref="helpfulcore/geoIp/loggingService" />
        </processor>
      </startTracking>
    </pipelines>-->
    <experienceAnalytics>
      <api>
        <dimensions>
          <dimension id="{1879168B-AF5E-4E9C-9DAE-8B71125F2AD2}">
            <transformer type="Helpfulcore.GeoIp.DimensionKeyTransformers.RegionDimensionKeyTransformer, Helpfulcore.GeoIp"                          patch:instead="*[@type='Sitecore.ExperienceAnalytics.Api.Response.DimensionKeyTransformers.RegionDimensionKeyTransformer, Sitecore.ExperienceAnalytics.Api']">
            </transformer>
          </dimension>
        </dimensions>
      </api>
    </experienceAnalytics>
  </sitecore>
</configuration>

如您所见,有两种提到的服务的检索器和适配器的实现。默认情况下,它使用ip-api.com服务,我会告诉你为什么在下面。
还有专用的日志文件,模块会记录所有信息,使其保持独立。
并且总有一个地方可以在将来为它们实现新的检索器和适配器。

Freegeoip.net提供商

这是我发现和实施的第一个。格式很简单:http://freegeoip.net/xml/{your_ip_or_hostname}
我试图使用它,结果发现它没有给出非常精确的结果,但它仍然可以正常工作。
它仍然包含在默认模块配置文件中,可以通过注释来简单地启用它。

Ip-api.com提供商

自从进一步研究后,我遇到了这项服务。它使用非常相似的格式:http://ip-api.com/json/{your_ip}
我可以说我对这项服务的回报或多或少感到满意,统计数据看起来很好,或多或少相关。
将附上一些截图:

国家
地区

正如你所看到的,仍有未被发现的地区和国家......但这是一项免费服务🙂

将区域与可读值匹配

Hovewer,在使用这些服务之后,我意识到在体验分析中总是存在未被认可的区域。我已经发现两个提到的服务都使用  ISO 3166国家/地区格式,  而默认的Sitecore提供商使用不同的东西。
为了在XP Analytics中显示正确的区域,我必须实现这个类  有用的核心.GeoIp.Iso3166_Regions  ,它将ISO代码转换为人类可读的名称,然后注入区域的维度转换:

1
2
3
4
五
6
7
8
9
10
11
12
13
14
15
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
  <sitecore>
    <experienceAnalytics>
      <api>
        <dimensions>
          <dimension id="{1879168B-AF5E-4E9C-9DAE-8B71125F2AD2}">
            <transformer type="Helpfulcore.GeoIp.DimensionKeyTransformers.RegionDimensionKeyTransformer, Helpfulcore.GeoIp"
                         patch:instead="*[@type='Sitecore.ExperienceAnalytics.Api.Response.DimensionKeyTransformers.RegionDimensionKeyTransformer, Sitecore.ExperienceAnalytics.Api']">
            </transformer>
          </dimension>
        </dimensions>
      </api>
    </experienceAnalytics>
  </sitecore>
</configuration>

调试本地环境

最终,Sitecore会忽略localhost 127.0.0.1 IP,并且不会调用查找管理器来检索该信息。但是有一种方法可以替换/模拟传递给查找管理器的IP。在默认配置中,有一个注释管道处理器,您可以在开发环境中取消注释以进行测试和调试:

1
2
3
4
五
6
7
8
9
10
11
12
13
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
  <sitecore>
    <!--Override IP on local environment if required-->
    <pipelines>
      <startTracking>
        <processor type="Helpfulcore.GeoIp.OverrideIpAddress, Helpfulcore.GeoIp" patch:before="*[@type='Sitecore.Analytics.Pipelines.StartTracking.UpdateGeoIpData, Sitecore.Analytics']">
          <param name="ipAddress">213.242.89.104</param>
          <param name="logger" ref="helpfulcore/geoIp/loggingService" />
        </processor>
      </startTracking>
    </pipelines>
  </sitecore>
</configuration>

您可以在config中选择直接使用哪个IP。
该模块确定了Sitecore中Geo IP位置的所有逻辑,如果需要,可以使用新服务进一步扩展。如果您觉得有值得分享的优质服务,请提取请求。
当然,所有免费的Geo IP服务都不会给出非常精确的结果,我仍然建议使用Sitecore订阅,据我所知使用MaxMind数据库,它提供相关信息并定期更新

posted @ 2021-08-03 16:57  JackYang  阅读(95)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3