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

Can I still access a sitecore contact facet once session is flushed?

我希望我没有搞错(因为 sitecore 文档总是很糟糕!)

我想要一种针对访问者存储信息的方法,我对 sitecore 相当陌生,但是 contact facets seemed the ideal 解决方案几乎是从上面的 link 逐字逐句实施的,直到它命中生产我对它很满意。当我存储信息时,它仍然存在,我可以读取它:

public IMpmVisitorFacet GetMpmVisitorFacet()
{
    return _contact.GetFacet<IMpmVisitorFacet>(_MPMVisitorConfigName);
}

并设置信息,一切看起来都很棒。我还可以看到正在设置 sitecore SC_ANALYTICS_GLOBAL_COOKIE,一切看起来都很棒。然后我做了一些更彻底的测试...

问题似乎是数据不会持续很长时间。如果我将一些信息放入 facet 中,它将停留一个小时左右(我可以关闭浏览器,查看其他网站,等等)并且我将能够访问它但是在 "amount of time" 一切都消失了。

重新访问文档(我有没有提到它们不是很好)我注意到一个句子中的警告,这是我以前没有看到的:

Well, I can create another web form page that only reads the employee number. That will show me that the contact facet data is being stored in memory at least. But what about permanent storage?

等等,我以为这是永久存储?!所以这个例子显示了一些代码来读取 "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>

但这方面似乎只存在很短的一段时间。然后继续:

For performance reasons Sitecore only writes contact data to xDB when the session ends.This means that if I look in MongoDB...

然后它继续在闪亮的新时尚 mongoDb 实现中显示数据。但是,如果我无法以编程方式实际访问和使用该信息,它在 mongo 中有什么用!

所以这就提出了一个问题,一旦会话被放弃,我该如何访问这个联系信息?

即用户登录我的网站 -> 我在他们的联系方式中添加了一些信息 -> 他们第二天回来 -> 我想阅读我之前添加的信息

experience profile, to index into Lucene and in the Experience platform(为什么有两个名称几乎完全相同的产品?!)还有其他几个文档讨论了如何访问此数据,但没有说明如何在网站中访问此信息本身,在代码中。


要添加到 Dmytro Shevchenko 的评论中:

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

我认为您可能在这里缺少的步骤是 Tracker.Current.Session.Identify() 识别已知联系人的方法。追踪器中的数据api只持续当前会话,您需要将联系人加载到会话中。

xDB 的实施依赖于联系人在访问网站时通过登录或注册等方式识别自己。

他们登录后,您可以使用唯一标识符(例如电子邮件地址)并将其传递给识别方法 -Tracker.Current.Session.Identify("Email Address of the visitor").

调用此方法后,如果用户之前已经确定了自己的身份,则联系人数据将加载到当前会话中,并且任何现有的方面信息都将在跟踪器中可用Api。

经过大量的调试、摆弄和测试,我终于弄明白了。事实证明,我的问题不是写入 mongo,而是写入 mongo 后的回读。

sitecore 文档似乎(像往常一样)完全遗漏了这个工作的一个相当基本的部分。大约三分之一 way down the docs it states:

public EmployeeData()
{
    base.EnsureAttribute<string>(FIELD_EMPLOYEE_ID);
}

The "EnsureAttribute" method is the equivalent of declaring a value-type variable.


好吧,这是非常具有误导性的。 EnsureAttribute 似乎是将 facet 的数据从 mongo 加载到当前的 class。 如果您不对 中的每个 属性 执行此操作,那么它不会设置来自 mongoDb 的值! 这是我的错误,我在 class.

中没有 "ensured" 每个 属性

所以发生的事情是,

  • 我把我的数据放到facet
  • 分面数据保留在会话中,我可以看到、访问它、更改它等等
  • 数据最终刷新到 mongo(如果必须,则为 xDb)
  • 用户returns,系统正确识别他们(不需要识别用户SC_ANALYTICS_GLOBAL_COOKIE会为您完成)
  • 但它不会加载数据(从 mongo 出来并返回到会话中),除非您 "ensure" 它。

所以 EnsureAttribute 不会 "declare a value type" (我认为这是完全错误的)它从 mongo 加载数据db 并进入当前 Session

你的问题在于你如何拉联系人: 如果您在页面请求中,您应该通过 Tracker.Current.Contact 访问当前联系人。 您的代码不在页面请求中,但用户可能有实时会话,请将 ContactManager 与上述方法一起使用。 如果联系人现在不在实时会话中,您应该使用 ContactRepository。请在此处查看有关如何使用它的示例。 复制自 https://sitecore.stackexchange.com/questions/3319/why-are-custom-xdb-facets-being-overwritten-on-session-end 德米特里舍甫琴科的回答。