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数据库,它提供相关信息并定期更新