2010-07-30 21 views
6

Qualcuno ha avuto fortuna con l'utilizzo di un servizio Web .NET per accedere agli elementi Sitecore? Ho un certo numero di applicazioni web sul mio server che sono ancora in Coldfusion. Mi piacerebbe essere in grado di chiamare un servizio web per tirare giù gli elementi, ma quando ho provato a farlo ho ottenuto un'eccezione "Sitecore.Data.Items.Item non può essere serializzato perché non ha un costruttore senza parametri."accesso Sitecore articoli via servizio Web .NET

+1

non sono sicuro che sia possibile. Un Sitecore.Data.Items.Item è molto robusto (leggi: pieno di metodi che fanno più chiamate DAL Sitecore) e in realtà non è adatto per essere restituito da un servizio web. Perché stai facendo questo? Forse c'è un'implementazione più semplice? – EliThompson

+0

Sono decisamente aperto a qualcosa di più semplice. Fondamentalmente ho un numero di elementi di contenuto in Sitecore che devono essere visualizzati in un'applicazione Coldfusion. Nel mio caso particolare ho tutti i miei articoli di notizie su Sitecore, ma ci sono un certo numero di applicazioni Coldfusion che, in un modo o in una forma, estraggono le notizie. – Kyle

+0

un sacco di opzioni offerte per rispondere a questo Q, ma non abbastanza chiaro feedback per dare all'uomo una buona risposta. – techphoria414

risposta

7

Date un'occhiata al servizio di web standard Sitecore, lo si può trovare sotto/cartella/WebService Sitecore/guscio della vostra soluzione. Offre alcune operazioni di base con articoli e campi Sitecore, ma è spesso sufficiente per estrarre o salvare dati.

Spero che questo aiuti.

+2

Grazie per il suggerimento. Penso di aver sostanzialmente concluso che non si può fare comunque. – Kyle

+0

puoi spiegare ulteriormente perché il servizio standard non funzionerà per te? basato su tutto ciò che stai dicendo qui, suona come la migliore soluzione – techphoria414

+1

Sono sicuro che funzionerebbe in qualche modo.La chiave qui è che voglio essere in grado di riutilizzare i metodi che ho già scritto per recuperare una serie specifica di elementi che sono utilizzati all'interno di un controllo web su una delle mie pagine sitecore. Fondamentalmente non voglio avere due pezzi di codice diversi da mantenere che fanno essenzialmente la stessa cosa. – Kyle

2

ho risposto questo sul SDN forum pure. Puoi creare il tuo oggetto wrapper che è riempito con un oggetto Sitecore e imposta i suoi membri. La parte difficile sarà quella di criptare i tuoi membri e assegnarli dal vero oggetto Sitecore. Se vuoi tutto allora penso che sarà difficile. Se vuoi solo alcune cose allora è fattibile. Per esempio.

[Serializable] 
public class SitecoreItem { 
    public string ID; 
    // more members 

    SitecoreItem(Sitecore.Data.Items.Item scItem) { 
     this.ID = scItem.ID; 
     // assign more members from the true Sitecore item 
    } 

} 

Poi nel metodo WS riempire una nuova istanza con il vostro oggetto reale Sitecore e restituirla:

return new SitecoreItem(actualSCItem); 
+0

Grazie, questo ha senso. Qualche idea su come renderlo più generico? Mi piacerebbe avere qualcosa che posso usare per qualsiasi articolo per restituire tutti i campi. Mi rendo conto che hai detto che sarebbe stato più difficile, ma hai qualche idea su come iniziare a fare questo? – Kyle

+0

Non è possibile serializzare la classe Sitecore.Data.Items.Item in modo che l'unico modo sarebbe creare un wrapper e svolgere il lavoro di assegnazione dei membri. Questa soluzione è generica se si prende il tempo di esaminare tutte le proprietà. L'unica altra opzione sarebbe quella di utilizzare il WS Yan incorporato menzionato –

+0

La classe Fields può essere serializzata? Questa sarebbe la chiave per me. Ho bisogno di ottenere tutte le informazioni sul campo e non tutti i modelli contengono gli stessi campi. – Kyle

1

Se sia il serialiser e deserialiser hanno accesso alla banca dati Sitecore, allora si può molto creare facilmente un wrapper che serializza solo l'ID, il nome del database, la versione e la lingua. Quindi, con la deserializzazione dall'altra parte, è possibile recuperare lo stesso oggetto Sitecore dal database utilizzando tali informazioni.

Se il deserialiser non ha accesso al database a tutti, poi dipende da cosa i vostri bisogni sono per l'utilizzo dei dati. In genere faccio un loop su tutti i campi (ricordati di usare prima item.Fields.ReadAll()) e memorizzali in un dizionario per un facile accesso. Per la serializzazione, ho convertire in un List<T> di coppie di valori chiave e ignorare l'elemento Dictionary (in quanto non può essere serializzato) e quindi ripopolare su deserialisation. Tengo anche alcune altre proprietà come ID, Language, Version, Template, Path, ecc. Anche per la classe.

In alternativa, se si crea un'intera libreria di classi modello in modo che ogni modello sia mappato su una classe (alcune persone lo fanno), è possibile (probabilmente) serializzare quelli direttamente poiché sono (probabilmente) non più legati a un Oggetto Sitecore.

+0

L'intera libreria di classi è esattamente ciò che facciamo. Ogni modello ha una classe e ogni campo è mappato a una proprietà. Abbiamo creato uno strumento in Sitecore per costruirli automaticamente. Raccomando questo approccio, ma solo se è possibile automatizzarlo. In caso contrario, è altrettanto noioso come creare il wrapper per ogni membro dell'elemento Sitecore. –