我希望我在这里没有得到错误的结论(因为sitecore文档总是很糟糕!)
我想要一种方法来存储针对访问者的信息,我是sitecore的新手,但是contact facets seemed the ideal解决方案,几乎是从上面的链接逐字实施,直到它投入生产我很高兴用它。当我存储信息时,我可以阅读它:
public IMpmVisitorFacet GetMpmVisitorFacet()
{
return _contact.GetFacet<IMpmVisitorFacet>(_MPMVisitorConfigName);
}
并设置信息,一切似乎都很棒。我还可以看到sitecore SC_ANALYTICS_GLOBAL_COOKIE
被设置,一切看起来都很精彩。然后我做了一些更全面的测试...
问题似乎是数据不会持续很长时间。如果我将一些信息放入方面,它将会闲置一个小时左右(我可以关闭浏览器,查看其他网站等等)并且我可以访问它但是在“时间“这一切都消失了。
重新访问了文档(我提到过他们不是很好)我注意到一句话中的一个警告我以前没有看到过:
好吧,我可以创建另一个只读取员工的Web表单页面 数。这将告诉我正在存储联系方面数据 至少在记忆中。但永久存储呢?
等一下,我以为这是永久存储?!因此,该示例显示了一些代码来阅读“facet”。
var contact = Tracker.Current.Contact;
var data = contact.GetFacet<IEmployeeData>("Employee Data");
data.EmployeeId = "ABC123";
.....
<p>Employee data contact facet updated.</p>
<p>Contact ID: <b><%=contact.ContactId.ToString()%></b></p>
<p>Employee #: <b><%=data.EmployeeId%></b></p>
但这个方面似乎只存在很短的时间。然后继续:
出于性能原因,Sitecore仅将联系人数据写入xDB 会话结束。这意味着,如果我查看MongoDB ...
然后继续显示其新的闪亮时尚mongoDb实现中的数据。但是如果我无法以编程方式实际访问和使用该信息,那么在mongo中有什么用呢!
所以这提出了一个问题,一旦会话被放弃,我该如何访问这些联系信息?
即。用户登录我的网站 - &gt;我在他们的联系方面添加了一些信息 - &gt;他们第二天回来了 - &gt;我想阅读我之前添加的信息
还有其他一些文档讨论了在experience profile,index into Lucene和in the Experience platform中访问此数据的问题(为什么有两个产品的名称几乎完全相同?!)但没有说明如何在代码中访问网站本身的这些信息。
要按Dmytro Shevchenko添加评论:
所以将新信息写入mongo似乎是一个问题 ...有没有人对此有任何帮助或类似经验?
答案 0 :(得分:2)
经过大量的调试,摆弄和测试后我终于弄明白了。事实证明,我的问题不在于mongo的写作,而是在写完mongo的时候。“/ p>
sitecore文档似乎(像往常一样)完全错过了相关工作的基本部分。大约三分之一的way down the docs it states:
public EmployeeData() { base.EnsureAttribute<string>(FIELD_EMPLOYEE_ID); }
&#34; EnsureAttribute&#34;方法相当于声明一个 值类型变量。
好的,这是非常误导的。这个EnsureAttribute
似乎要做的是将facet的数据从mongo加载到当前类中。 如果你不为你方面的每个属性做这个,那么它就不会设置mongoDb中的值!这是我的错误,我没有&#39; t&#34;确保&#34;班上的每一处房产。
所以发生了什么,
SC_ANALYTICS_GLOBAL_COOKIE
为您执行此操作)所以EnsureAttribute
没有&#34;声明一个值类型&#34; (我认为这完全是错的)它将数据从mongodb加载到当前Session
。
答案 1 :(得分:0)
我认为您可能缺少的步骤是Tracker.Current.Session.Identify()
方法来识别已知联系人。 Tracker api中的数据仅适用于当前会话,您需要将联系人加载到会话中。
xDB的实现依赖于联系人在访问站点时通过登录或注册来识别自己。
一旦他们登录,您就可以使用唯一的标识符,例如电子邮件地址,并将其传递给身份识别方法 - Tracker.Current.Session.Identify("Email Address of the visitor")
。
调用此方法后,如果用户先前已识别出自己,则联系人数据将加载到当前会话中,并且跟踪器Api中将提供任何现有构面信息。
答案 2 :(得分:-1)
您的问题在于如何拉动联系人: 如果您在页面请求中,则应通过Tracker.Current.Contact访问当前联系人。 您的代码不在页面请求中,但用户可能有实时会话,请使用上述方法的ContactManager。 如果联系人现在不在实时会话中,则应使用ContactRepository。请在此处查看有关如何使用它的示例。 复制自Dmitry Shevchenko回答的https://sitecore.stackexchange.com/questions/3319/why-are-custom-xdb-facets-being-overwritten-on-session-end。