Sitecore 8.2的自定义地理IP位置服务
如果您出于某种原因不想使用Geo IP的默认Sitecore提供程序,那么有一种方法可以实现您自己的自定义Geo IP提供程序。
大家都知道Sitecore为Geo IP位置提供服务。为了能够使用它,您需要购买额外的订阅。但是,如果您由于某种原因不想使用Geo IP的默认Sitecore提供程序,则有一种方法可以实现您自己的自定义Geo IP提供程序。 根据我一直在研究的内容,我发现了两种可以免费提供Geo IP查找的服务:
Helpfulcore.GeoIp
我尝试使用两者并分享Sitecore模块,该模块可以简单地作为nuget包集成到Sitecore解决方案中。 请在github上找到这个项目 它可以在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="/">
<sitecore>
<helpfulcore>
<geoIp>
<!--Free Geo IP-->
<freeGeoIpRetriever type="Helpfulcore.GeoIp.FreeGeoIpNet.FreeGeoIpNetRetriever, Helpfulcore.GeoIp">
<param name="serviceEndpoint">/</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">/</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服务,我会告诉你为什么在下面。 还有专用的日志文件,模块会记录所有信息,使其保持独立。 并且总有一个地方可以在将来为它们实现新的检索器和适配器。
Freegeoip提供商
这是我发现和实施的第一个。格式很简单:http://freegeoip/xml/{your_ip_or_hostname} 我试图使用它,结果发现它没有给出非常精确的结果,但它仍然可以正常工作。 它仍然包含在默认模块配置文件中,可以通过注释来简单地启用它。
Ip-api提供商
自从进一步研究后,我遇到了这项服务。它使用非常相似的格式:http://ip-api/json/{your_ip} 我可以说我对这项服务的回报或多或少感到满意,统计数据看起来很好,或多或少相关。 将附上一些截图:
正如你所看到的,仍有未被发现的地区和国家......但这是一项免费服务