2015-09-29 10 views
5

Sto sperando che non ho ottenuto la parte sbagliata del bastone qui (come sempre la documentazione Sitecore è doloroso!)Posso accedere ancora a un aspetto del contatto sitecore una volta che la sessione è stata scaricata?

volevo un modo per memorizzare le informazioni contro un visitatore, io sono abbastanza nuovo per Sitecore , ma la soluzione contact facets seemed the ideal, praticamente implementata parola per parola dal link sopra, fino a quando non ha colpito la produzione, ne sono rimasto abbastanza soddisfatto. Quando ho memorizzato le informazioni che persisteva, ho potuto leggere:

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

e impostare informazioni e tutto sembrava fantastico. Potevo anche vedere il set del sitecore SC_ANALYTICS_GLOBAL_COOKIE, tutto sembrava meraviglioso. Poi ho fatto alcuni test più approfonditi ...

Il problema sembra essere che i dati non durano a lungo. Se metto qualche informazione nel facet, questa si aggirerà per circa un'ora (posso chiudere il mio browser, guardare altri siti, ecc. Ecc.) E potrò accedervi ma dopo una "quantità di tempo "tutto va via.

Dopo aver rivisitato la documentazione (ho ho detto che non sono molto buono) ho notato un avvertimento in una frase che non ho visto prima:

Beh, posso creare un'altra pagina web form che legge solo il numero impiegato. Questo mi mostrerà che i dati della faccetta di contatto vengono memorizzati nella memoria nella memoria. Ma che dire dello storage permanente?

Aspetta, ho pensato che fosse un deposito permanente ?! Quindi l'esempio mostra un codice per leggere il "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> 

Ma questo aspetto sembra esistere solo per un breve periodo di tempo. Si passa quindi:

Per motivi di prestazioni Sitecore scrive solo i dati di contatto per xDB quando le ends.This sessione significa che se mi guardo MongoDB ...

si passa poi a mostrare i dati nella sua nuova e brillante implementazione di mongoDb alla moda. Ma a cosa serve in mongo se non riesco ad accedere e usare le informazioni in modo programmatico!

Quindi questo solleva la questione come accedo a queste informazioni di contatto una volta che la sessione è stata abbandonata?

cioè utente accede il mio sito -> aggiungo alcune informazioni nel loro aspetto contatto -> tornano il giorno successivo -> voglio leggere le informazioni ho aggiunto in precedenza

Ci sono diversi altri documenti che parlare di accesso a questi dati nel experience profile, a index into Lucene e in the Experience platform (perché hanno due prodotti con quasi lo stesso nome ?!) ma nulla da dire come accedere a queste informazioni nel sito web stesso, nel codice.


Per aggiungere ai commenti per Dmytro Shevchenko:

  • posso vedere il mio un utente nel "profilo di esperienza" e posso vedere i miei visite al sito.
  • So che questo utente ha avuto le mie informazioni aggiuntive sul facet perché è stato attivato il codice .
  • riesco a trovare il mio utente (dal id tolto la stringa di query nel pagina del profilo esperienza) nel Mongo Db
  • Ma quando guardo l'utente nella MongoDB le informazioni supplementari non è lì.
  • alcuni dei record di contatto avere questi dati, ma gli altri non

Così sembra essere un problema con la scrittura le nuove informazioni per mongo ... Qualcuno ha qualche aiuto o simile esperienza di Questo?

+1

* "come accedere a queste informazioni di contatto una volta che la sessione è stata abbandonata?" * - è necessario accedere a un contatto con le sue facce * esterne * di una sessione Web (ad esempio da un servizio in background)? O hai bisogno di accedere alle sfaccettature del contatto in una nuova sessione web dello stesso contatto? –

+0

Nuova sessione Web dello stesso contatto – Liam

+3

In questo caso, i dati dovrebbero essere lì. Sei sicuro che sia lo stesso contatto esatto con cui stai lavorando in un'altra sessione web? Controlla 'ContactID'. –

risposta

2

Dopo una lunga serie di operazioni di debug, manipolazione e test, l'ho finalmente capito. Il mio problema, si è scoperto, non era la scrittura di Mongo che era nella lettura di Mongo una volta che era stato scritto.

La documentazione del sitecore sembra (come al solito) perdere completamente una parte piuttosto fondamentale del funzionamento di questo. Circa un terzo del way down the docs it states:

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

Il metodo "EnsureAttribute" è l'equivalente di dichiarazione di una variabile value-type.


Ok, questo è molto fuorviante. Quello che sembra fare questo EnsureAttribute è caricare i dati per il facet nella classe corrente da mongo. Se non lo fai per ogni proprietà nel tuo aspetto, allora non imposta il valore dal mongoDb! Questo è stato un mio errore, non avevo "assicurato" ogni proprietà della classe.

Così che cosa stava accadendo è,

  • ho messo i miei dati nella sfaccettatura
  • i dati sfaccettatura persiste nella Sessione e posso vedere, l'accesso è cambiarlo, ecc.
  • I dati sono poi lavata per mongo (XDB se si deve)
  • l'utente ritorna, il sistema li riconosce correttamente (non v'è alcuna necessità di identificare l'utente, il SC_ANALYTICS_GLOBAL_COOKIE fa questo per voi)
  • Ma non carica i dati (fuori da mongo e tornano nella sessione) a meno che tu non lo "assicuri".

Così il EnsureAttribute non fa "dichiara un tipo di valore" (questo è solo totalmente sbagliato a mio parere) che carica i dati da MongoDB e nella corrente Session.

0

Penso che il passo che potreste mancare qui è il metodo Tracker.Current.Session.Identify() per identificare un contatto conosciuto. I dati nell'API Tracker durano solo per la sessione corrente e devi caricare il contatto nella sessione.

L'implementazione di xDB si basa su un contatto che si identifica quando visita il sito, accedendo o registrandosi ad esempio.

Una volta effettuato l'accesso, è possibile utilizzare un identificatore univoco, ad esempio l'indirizzo e-mail e trasmetterlo al metodo di identificazione - Tracker.Current.Session.Identify("Email Address of the visitor").

Dopo aver chiamato questo metodo, se l'utente si è identificato in precedenza, i dati del contatto verranno caricati nella sessione corrente e tutte le informazioni di sfaccettatura esistenti saranno disponibili nel Tracker Api.

+0

Ma non ho nessun utente informazioni a questo punto, sono un utente anonimo. I dati esistono ma non sembra che si svuotino nell'istanza di mongo. Non sono chiaro come questo aiuti? – Liam

+0

Puoi spiegare * L'implementazione di xDB si basa su un contatto che si identifica quando visita il sito *? Dove nella documentazione dice questo? Questo non sembra legarsi con i commenti di @Dmytro (sopra) o qualcosa che ho letto al riguardo sul sito web del sitecore? – Liam

0

Il tuo problema stabilisce per quanto riguarda come si tira il contatto: Se vi trovate in una richiesta di pagina, è necessario accedere al contatto corrente tramite Tracker.Current.Contact. il tuo codice non è in una richiesta di pagina, ma l'utente può avere una sessione live, usa ContactManager con i metodi descritti sopra. Se il contatto non è in una sessione live in questo momento, è necessario utilizzare ContactRepository. Guarda un esempio su come usarlo qui. Copiato da https://sitecore.stackexchange.com/questions/3319/why-are-custom-xdb-facets-being-overwritten-on-session-end risposto da Dmitry Shevchenko.