刷新会话后,我仍然可以访问sitecore联系方面吗?

时间:2015-09-29 13:36:53

标签: mongodb sitecore sitecore8 sitecore-xdb

我希望我在这里没有得到错误的结论(因为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 profileindex into Lucenein the Experience platform中访问此数据的问题(为什么有两个产品的名称几乎完全相同?!)但没有说明如何在代码中访问网站本身的这些信息。

要按Dmytro Shevchenko添加评论:

  • 我可以在“体验资料”中看到我的用户,我可以看到我的用户 访问该网站。
  • 我知道这个用户确实有我的附加方面信息,因为它 触发了一些代码。
  • 我可以找到我的用户(来自id中的查询字符串) mongo Db中的体验资料页面)
  • 但是当我在mongoDb中查看用户时,附加信息是 不在那里。
  • 某些联系人记录包含此数据,但其他记录

所以将新信息写入mongo似乎是一个问题 ...有没有人对此有任何帮助或类似经验?

3 个答案:

答案 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;班上的每一处房产。

所以发生了什么,

  • 我将数据放入facet
  • facet数据在Session中持续存在,我可以看到,访问它会改变它等等。
  • 数据最终会刷新为mongo(如果必须,则为xDb)
  • 用户返回,系统正确识别它们(无需识别用户SC_ANALYTICS_GLOBAL_COOKIE为您执行此操作)
  • 但是它不会加载数据(从mongo中加载到会话中),除非你确保&#34;它。

所以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