Могу ли я получить доступ к фасету контакта sitecore после сброса сеанса?

Я надеюсь, что не ошибся здесь (как всегда, документация sitecore ужасна!)

Мне нужен был способ хранения информации о посетителе, я новичок в sitecore, но контактные фасеты казались идеальнымрешением, в значительной степени дословно реализованным по ссылке выше, пока оно не попало в производство. был вполне доволен этим. Когда я сохранял информацию, она сохранялась, я мог ее прочитать:

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

и установить информацию, и все казалось большим. Я также мог видеть, как устанавливается sitecore SC_ANALYTICS_GLOBAL_COOKIE, все казалось замечательным. Потом я провел более тщательные тесты...

Проблема, по-видимому, в том, что данные просто не сохраняются долго. Если я помещу какую-то информацию в фасет, она будет зависать в течение часа или около того (я могу закрыть браузер, посмотреть другие сайты и т. д. и т. д.), и я смогу получить к ней доступ, но после «количества время" просто все уходит.

Пересмотрев документы (я упоминал, что они не очень хороши), я заметил оговорку в предложении, которую раньше не видел:

Ну, я могу создать другую страницу веб-формы, которая считывает только номер сотрудника. Это покажет мне, что данные фасета контакта хранятся по крайней мере в памяти. А как насчет постоянного хранения?

Подождите, я думал, это постоянное хранилище?! Итак, в примере показан некоторый код для чтения «фасета».

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. Но какая польза в монго, если я не могу получить доступ к этой информации и использовать ее программно!

Поэтому возникает вопрос, как мне получить доступ к этой контактной информации после того, как сеанс будет прерван?

т. е. пользователь входит на мой сайт -> я добавляю некоторую информацию в их контактную форму -> они возвращаются на следующий день -> я хочу прочитать информацию, которую я добавил ранее

Есть несколько других документов, в которых говорится о доступе к этим данным в профиль опыта, на индексировать в Lucene и на платформе Experience(почему два продукта с почти одинаковыми названиями?!), но нечего сказать, как получить доступ к этой информации на самом веб-сайте, в коде .


Чтобы добавить к комментариям Дмытро Шевченко:

  • Я вижу своего пользователя в «профиле опыта» и вижу свои посещения сайта.
  • Я знаю, что у этого пользователя была дополнительная информация о моем аспекте, потому что она активировала некоторый код.
  • Я могу найти своего пользователя (из идентификатора, взятого из строки запроса на странице профиля опыта) в mongo Db
  • Но когда я смотрю на пользователя в mongoDb, дополнительной информации там нет.
  • в некоторых контактных записях есть эти данные, а в других нет

Похоже, это проблема с записью новой информации в монго... Есть ли у кого-нибудь помощь или аналогичный опыт?


person Liam    schedule 29.09.2015    source источник
comment
как мне получить доступ к этой контактной информации после прекращения сеанса? — нужен ли вам доступ к контакту с его аспектами вне веб-сеанса (например, из фоновой службы) ? Или вам нужно получить доступ к аспектам контакта в новом веб-сеансе того же контакта?   -  person Dmytro Shevchenko    schedule 29.09.2015
comment
Новый веб-сеанс того же контакта   -  person Liam    schedule 29.09.2015
comment
В таком случае данные должны быть. Вы уверены, что это тот же самый контакт, с которым вы работаете в другом веб-сеансе? Проверьте ContactID.   -  person Dmytro Shevchenko    schedule 29.09.2015
comment
Кроме того, после завершения первого сеанса просмотрите данные, которые были сохранены в MongoDB. Аспекты контакта хранятся как дочерние документы контакта.   -  person Dmytro Shevchenko    schedule 29.09.2015
comment
@ДмытроШевченко прав. Вы уверены, что записываете данные пользователю контекста?   -  person nsgocev    schedule 29.09.2015
comment
когда вы говорите, что он должен быть там, вы имеете в виду, что я должен иметь доступ к нему из Tracker.Current.Session.Contact.GetFacet<IMpmVisitorFacet>(_MPMVisitorConfigName);? не просто просмотреть его в MongoDb?   -  person Liam    schedule 29.09.2015
comment
@Лиам, да, таким образом вы сможете получить доступ к ранее сохраненным данным.   -  person Dmytro Shevchenko    schedule 29.09.2015
comment
Хорошо, я проверю другую конфигурацию, может быть, я немного несправедлив к sitecore...   -  person Liam    schedule 29.09.2015


Ответы (3)


После долгой отладки, возни и тестирования я, наконец, понял это. Моя проблема, как оказалось, заключалась не в записи в монго, а в чтении из монго после того, как оно было написано.

Документация sitecore, кажется (как обычно), полностью упускает из виду довольно фундаментальную часть работы этого. Около трети вниз по документам:

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

Метод EnsureAttribute эквивалентен объявлению переменной типа значения.


Хорошо, это очень вводит в заблуждение. Похоже, что этот EnsureAttribute загружает данные для фасета в текущий класс из монго. Если вы не сделаете это для каждого свойства в вашем фасете, тогда оно не установит значение из mongoDb! Это была моя ошибка, я не "гарантировал" каждое свойство в классе.

Итак, что происходило,

  • Я помещаю свои данные в грань
  • данные фасета сохраняются в сеансе, и я могу видеть, получать к ним доступ, изменять их и т. д.
  • Данные в конечном итоге сбрасываются в монго (xDb, если необходимо)
  • пользователь возвращается, система правильно его распознает (нет необходимости идентифицировать пользователя, SC_ANALYTICS_GLOBAL_COOKIE сделает это за вас)
  • Но он не загружает данные (из монго и обратно в сеанс), если вы не «обеспечите» это.

Таким образом, EnsureAttribute не "объявляет тип значения" (на мой взгляд, это совершенно неправильно), он загружает данные из mongodb в текущий Session.

person Liam    schedule 30.09.2015

Я думаю, что шаг, который вы можете пропустить здесь, — это метод Tracker.Current.Session.Identify() для идентификации известного контакта. Данные в API Tracker сохраняются только для текущего сеанса, и вам необходимо загрузить контакт в сеанс.

Реализация xDB зависит от контакта, который идентифицирует себя при посещении сайта, например, войдя в систему или зарегистрировавшись.

После того, как они вошли в систему, вы можете использовать уникальный идентификатор, например, адрес электронной почты, и передать его методу идентификации -Tracker.Current.Session.Identify("Email Address of the visitor").

После вызова этого метода, если пользователь идентифицировал себя ранее, контактные данные будут загружены в текущий сеанс, а любая существующая информация о аспекте будет доступна в Tracker API.

person Ian Graham    schedule 29.09.2015
comment
Но на данный момент у меня нет никакой информации о пользователе, это анонимный пользователь. Данные существуют, но, похоже, не сбрасываются в экземпляр монго. Я не понимаю, как это помогает? - person Liam; 30.09.2015
comment
Можете ли вы объяснить, реализация xDB основана на том, что контакт идентифицирует себя при посещении сайта? Где в документации об этом говорится? Кажется, это не связано с комментариями @Dmytro (выше) или чем-либо, что я читал об этом на веб-сайте sitecore? - person Liam; 30.09.2015

Ваша проблема заключается в том, как вы вытаскиваете контакт: если вы находитесь в запросе страницы, вы должны получить доступ к текущему контакту через Tracker.Current.Contact. ваш код не находится в запросе страницы, но у пользователя может быть сеанс в реальном времени, используйте ContactManager с методами, описанными выше. Если контакт не находится в активном сеансе прямо сейчас, вы должны использовать ContactRepository. См. пример того, как его использовать здесь. Скопировано с https://sitecore.stackexchange.com/questions/3319/why-are-custom-xdb-facets-being-overwrite-on-session-end ответил Дмитрий Шевченко.

person Sergey Kravchenko    schedule 14.03.2017