我遇到了完全相同的问题,即列表管理器在将联系人添加到收件人列表后报告了 0 个联系人。
我仔细调查了这个问题,发现将联系人添加到收件人列表实际上只是在“sitecore_analytics_index”索引中的联系人上设置了一个字段(假设您使用 Mongo/XDB 作为底层存储)。具体而言,Sitecore 应使用值“ContactLists:{recipientListGuid}”更新联系人文档上的“contact.tags”字段。我尝试使用Luke 打开索引,以验证该字段确实没有在索引中设置。该索引位于 C:\inetpub\wwwroot[Sitename]\Data\indexes\sitecore_analytics_index。
这使我得出结论,您必须在将联系人添加到收件人列表后保存该联系人。
总结一下,以下代码对我有用:
var ecm = EcmFactory.GetDefaultFactory();
XdbContactId contactId = /* some valid contact id */;
LeaseOwner leaseOwner = new LeaseOwner("UpdateContact-" + Guid.NewGuid().ToString(), LeaseOwnerType.OutOfRequestWorker);
Sitecore.Analytics.Tracking.Contact contact;
string webClusterName;
var status = ecm.Gateways.AnalyticsGateway.TryGetContactForUpdate(contactId.Value,
leaseOwner,
TimeSpan.FromSeconds(5),
TimeSpan.FromSeconds(5),
out contact, out webClusterName);
var recipientList = ecm.Bl.RecipientCollectionRepository.GetEditableRecipientCollection(recipientListId);
if (recipientList != null)
{
if (!recipientList.Contains(contactId, true).Value)
{
recipientList.AddRecipient(contactId);
}
}
contact.ContactSaveMode = ContactSaveMode.AlwaysSave;
var contactRepository = new ContactRepository();
var success = contactRepository.SaveContact(contact, new ContactSaveOptions(true, leaseOwner));
注意,以上代码用于更新场景。在你的情况下,我猜你只需要移动这段代码:
contactRepository.SaveContact(contact, new ContactSaveOptions(true, null));
之后:
var recipientList = EcmFactory.GetDefaultFactory().Bl.RecipientCollectionRepository.GetEditableRecipientCollection(recipientListId);
if (recipientList != null)
{
var xdbContact = new XdbContactId(contactId);
if (!recipientList.Contains(xdbContact, true).Value)
{
recipientList.AddRecipient(xdbContact);
}
}
更新:实际上,仅当保存的联系人是 Sitecore Analytics 当前跟踪的联系人时,上述方法才有效。