首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Sitecore 8.2的自定义地理IP位置服务

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

作者头像
jack.yang
发布2025-04-05 18:05:18
发布2025-04-05 18:05:18
15400
代码可运行
举报
运行总次数:0
代码可运行

如果您出于某种原因不想使用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,请在程序包管理器控制台中运行以下命令

代码语言:javascript
代码运行次数:0
运行
复制
Install-Package Helpfulcore.GeoIp

架构和可扩展性

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

代码语言:javascript
代码运行次数:0
运行
复制
public interface IGeoIpLocationRetriever
{
    IGeoIpResponse GetInformationByIp(string ip);
}

适配器:

代码语言:javascript
代码运行次数:0
运行
复制
public interface IGeoIpDataAdapter
{
    WhoIsInformation Adapt(IGeoIpResponse providerObject);
}

查找提供者:

代码语言:javascript
代码运行次数:0
运行
复制
public class GeoIpLookupProvider : LookupProviderBase
{
    //...
    public GeoIpLookupProvider(
        IGeoIpLocationRetriever geoIpLocationRetriever,
        IGeoIpDataAdapter geoIpDataAdapter,
        ILoggingService logger)
    {
        // ...
    }
}

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

代码语言:javascript
代码运行次数:0
运行
复制
\App_Config\Include\Helpfulcore\Helpfulcore.GeoIp.config

使用下一个配置:

代码语言:javascript
代码运行次数:0
运行
复制
<?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代码转换为人类可读的名称,然后注入区域的维度转换:

代码语言:javascript
代码运行次数:0
运行
复制
<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。在默认配置中,有一个注释管道处理器,您可以在开发环境中取消注释以进行测试和调试:

代码语言:javascript
代码运行次数:0
运行
复制
<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数据库,它提供相关信息并定期更新

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-08-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Helpfulcore.GeoIp
  • 架构和可扩展性
  • Freegeoip.net提供商
  • Ip-api.com提供商
  • 将区域与可读值匹配
  • 调试本地环境
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档