2013-04-01 14 views
7

Sono nuovo nello sviluppo di Sitecore, quindi mi scuso se questa domanda è di base. Ho creato sia un agente (operazione pianificata) che un servizio WCF e li ho entrambi aggiunti al mio progetto SiteCore. L'agente chiama lo stesso codice che chiama il codice di servizio WCF.NullReferenceException quando si chiama Database Sitecore.Templates [] all'interno del servizio WCF

Il problema riscontrato è che quando si chiama Database.Template[ID template] passando nel contenitore ID del modello corrispondente per un elemento che si desidera elaborare, funziona all'interno dell'attività dell'agente, ma non all'interno del servizio WCF.

Qualsiasi chiamata a Database.Template[ID id] all'interno del servizio WCF mi fornisce un NullReferenceException, tuttavia la stessa chiamata all'interno dell'agente raccoglie correttamente il modello.

Ciò è dovuto a qualche motivo strutturale che dipende dall'applicazione chiamante che è una pagina Web anziché un servizio web?

Modifica # 1: Ho SVC come estensione consentita, e ho provato sia

Sitecore.Configuration.Factory.GetDatabase("master") 

e

var siteContext = Sitecore.Configuration.Factory.GetSite("websiteMaster"); 
siteContext.Database.Template[]; 

sia che restituiscono NullReferenceException.

Posso anche ottenere un articolo con GetItem, tuttavia quando provo ad accedere alla proprietà Template di quell'elemento, ottengo un NullReferenceException.

risposta

8

Non hai un Contesto Sitecore dal tuo servizio WCF e quindi Sitecore.Context.Database è nullo.

È possibile aggiungere svc alla lista delle estensioni consentiti o ottenere i dati via Sitecore.Configuration.Factory.GetDatabase("master")

+0

Grazie per la risposta. In realtà, ho statico privato Sitecore.Data.Database DB = Sitecore.Configuration.Factory.GetDatabase ("master"); definito come parte della mia implementazione del servizio e ancora ottengo questo errore. Inoltre, svc è stato aggiunto in web.config come un'estensione consentita. –

+1

Suppongo che il database 'var siteContext' nullo a questo punto? – jammykam

+0

Sono d'accordo con il punto jammykam su questo. Se non si dispone di riferimenti a DB, si otterrà nulla al punto in cui si chiama GetDatabase! –

0

Non è una soluzione ideale, ma ho trasformato questa quasi linea per la linea da un servizio WCF a un servizio basato su ASMX e tutto funziona bene. L'unico problema che ho avuto, è stato quando ho chiamato il servizio ho avuto un problema di autorizzazione di accesso.

ho avvolto le ASMX contenuti delle funzioni di servizio all'interno di un blocco di questo tipo:

using (new Sitecore.SecurityModel.SecurityDisabler()) { } 

E tutto magicamente iniziato a lavorare. Sto iniziando a chiedermi se questo non è un bug con il framework Sitecore che ho incontrato. Se qualcuno sa come inviare un rapporto formale, per favore fatemelo sapere.

+0

Questo in realtà ha senso poiché un utente anonimo non avrebbe generalmente accesso diretto ai modelli. Hai provato ad aggiungere il disabler di sicurezza nel codice WCF? Aggiungi un ticket con [Supporto Sitecore] (https://support.sitecore.net) se pensi che sia un bug. – jammykam

+0

Qual è la differenza b/n ASMX vs. WCF quando si chiama il database Sitecore? –

2

ci sono alcune parti a questa domanda

  • Elementi di programmazione Accesso utilizzando Sitecore Database
  • Sitecore Security
  • WCF & Sitecore HttpContext

Elementi di programmazione Accesso utilizzando Sitecore Database

  • La creazione di un servizio WCF da utilizzare con la lettura/modifica degli elementi Sitecore richiederebbe l'accesso al database Sitecore, vedere Programmatically Login into Sitecore
  • (come già accennato), utilizzando Sitecore.Configuration.Factory.GetDatabase(Database) esplicitamente ti porterà il database, tuttavia, che porta in primo piano problema numero 2.
  • Per sfruttare la funzionalità Sitecore integrata, è più flessibile utilizzare i metodi Sitecore.Context.ContentDatabase o Sitecore.Context.Database per restituire il database corretto in base al contesto in cui viene effettuata la richiesta; CD, server di CM, ecc

Security

  • Mentre il disabler sicurezza lavorerà per rimuovere tutti i problemi di sicurezza con l'accesso alla base di dati Sitecore non è raccomandato. Alex Soft and Sitecore Security

    using (new SC.Security.Accounts.UserSwitcher(User.FromName(ServiceAccountName, true))) 
    { 
        // code here 
    } 
    

allinea più propriamente con Sitecore's Security API, fornisce una scia sicurezza delle transazioni e consente il controllo delle versioni degli articoli modificati completati dai servizi. Tali informazioni saranno utili per il tracciamento e l'auditing dei bug.

WCF e Sitecore HttpContext:

  • Si può incorrere in problemi con l'utilizzo di WCF e oggetti che utilizzano il Sitecore HttpContext.
  • Se si desidera utilizzare Sitecore.Context.ContentDatabase o Sitecore.Context.Database nel servizio WCF, è probabile che si ottengano eccezioni null dal Database, soprattutto se si esegue il servizio su un'istanza CD.
  • L'unico uovo dorato di linea per superare questa limitazione è impostare il sito attivo utilizzando Sitecore.Context.SetActiveSite(SiteName), a un certo punto nel servizio (in genere il costruttore).
  • Il Nome sito è il nome dell'elenco di siti disponibili nella sezione Sitecore/Sites di web.config.
0

vale anche la verifica di Web \ App_Config \ Include \ SwitchMasterToWeb.config e la ridenominazione/rimozione se necessario in quanto rende il database master visualizzato come Web in caso contrario. Poiché è un patch config, può essere facilmente perso durante la risoluzione dei problemi.

Problemi correlati