2013-04-01 14 views
7

Jestem nowy w rozwoju Sitecore, więc moje przeprosiny, jeśli to pytanie jest podstawowe. Stworzyłem zarówno agenta (zaplanowane zadanie) i usługi WCF i oba zostały dodane do mojego projektu SiteCore. Agent wywołuje ten sam kod, który wywołuje kod usługi WCF.NullReferenceException podczas wywoływania Sitecore Database.Templates [] wewnątrz usługi WCF

Problem, który mam, polega na tym, że gdy wywołuję Database.Template[ID template] przekazując w kontenerze ID odpowiedniego szablonu dla elementu, który chcę przetworzyć, działa on wewnątrz zadania agenta, ale nie wewnątrz usługi WCF.

Każde połączenie z Database.Template[ID id] w ramach usługi WCF daje mi NullReferenceException, jednak to samo połączenie wewnątrz agenta zbiera prawidłowo szablon.

Czy jest to spowodowane przyczynami strukturalnymi, w zależności od tego, czy aplikacja wywołująca jest stroną internetową, czy usługą sieciową?

Edit # 1: Mam SVC jako dozwolonej rozszerzeniu i próbowałem zarówno

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

i

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

których oba powrócić NullReferenceException.

Mogę również pomyślnie uzyskać przedmiot, używając GetItem, jednak gdy próbuję uzyskać dostęp do właściwości szablonu tego elementu, otrzymuję NullReferenceException.

Odpowiedz

8

Nie masz kontekstu Sitecore ze swojej usługi WCF, więc Sitecore.Context.Database ma wartość null.

Można dodać svc do listy dozwolonych rozszerzeń lub uzyskać dane poprzez Sitecore.Configuration.Factory.GetDatabase("master")

+0

Dziękuję za odpowiedź. W rzeczywistości mam prywatne statyczne Sitecore.Data.Database DB = Sitecore.Configuration.Factory.GetDatabase ("master"); zdefiniowane jako część mojej implementacji usług i nadal otrzymuję ten błąd. Ponadto svc został dodany w pliku web.config jako dozwolone rozszerzenie. –

+1

Zakładam, że baza danych "var siteContext" ma teraz wartość null? – jammykam

+0

Zgadzam się z punktem jammykam na ten temat. Jeśli nie wspomnisz o żadnym odwołaniu do bazy danych, otrzymasz null w punkcie, w którym dzwonisz do GetDatabase! –

0

To nie jest idealnym rozwiązaniem, ale przeliczone to prawie liniowy dla linii z usługi WCF do usługi opartej na ASMX i wszystko działa dobrze. Jedynym problemem, jaki miałem, było to, że dzwoniąc do serwisu, dostałem problem z pozwoleniem na dostęp.

I owinął ASMX zawartość funkcję serwisową wewnątrz bloku tego typu:

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

I wszystko magicznie rozpoczął pracę. Zaczynam się zastanawiać, czy to nie jest błąd związany z ramą Sitecore, którą napotkałem. Jeśli ktoś wie, jak przesłać formalny raport, proszę dać mi znać.

+0

Ma to sens, ponieważ anonimowy użytkownik zazwyczaj nie ma bezpośredniego dostępu do szablonów. Czy próbowałeś dodać blokadę bezpieczeństwa w kodzie WCF? Podnieś bilet za pomocą [Sitecore Support] (https://support.sitecore.net), jeśli uważasz, że jest to błąd. – jammykam

+0

Jaka jest różnica b/w ASMX vs. WCF, gdy dzwonisz do Bazy danych Sitecore? –

2

Istnieje kilka części na to pytanie

  • Programowy dostęp do elementów za pomocą Sitecore Database
  • Sitecore Bezpieczeństwo
  • WCF & Sitecore HTTPContext

Programowo Uzyskiwanie dostępu do elementów za pomocą Sitecore Database

  • Tworzenie usług WCF do korzystania z czytaniem/edytowania elementów Sitecore wymaga dostępu do bazy danych Sitecore patrz Programmatically Login into Sitecore
  • (jak już wspomniano), stosując Sitecore.Configuration.Factory.GetDatabase(Database) wyraźnie będzie Ci bazę danych, jednak, że wywołuje szereg Wydanie 2.
  • Aby skorzystać z wbudowanej funkcjonalności Sitecore, bardziej elastyczne jest stosowanie metod zwracania odpowiedniej bazy danych w oparciu o kontekst, w którym żądanie jest tworzone; CD, serwer CM itd

Bezpieczeństwo

  • Choć disabler bezpieczeństwa będzie działać, aby usunąć wszystkie problemy z bezpieczeństwem z dostępu do bazy danych Sitecore nie jest to zalecane. Alex Soft and Sitecore Security

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

właściwie wyrównany Sitecore's Security API, stanowi szlak bezpieczeństwo transakcji oraz umożliwia wersjonowanie zmienionych elementów zrealizowanych przez służby. Takie informacje pomogą w śledzeniu błędów i audytach.

WCF i Sitecore HTTPContext:

  • Można uruchomić w kwestii korzystania z WCF i obiektów, które używają Sitecore HTTPContext.
  • Jeśli chcesz użyć usługi Sitecore.Context.ContentDatabase lub Sitecore.Context.Database w swojej usłudze WCF, prawdopodobnie uzyskasz zerowe wyjątki z bazy danych, szczególnie jeśli usługa jest uruchomiona na instancji CD.
  • Jedną liniową złotą jaja do pokonania tego ograniczenia jest ustawienie aktywnego witryny za pomocą Sitecore.Context.SetActiveSite(SiteName), w pewnym momencie usługi (zazwyczaj konstruktora).
  • Nazwa witryny jest nazwą listy witryn dostępnych w sekcji Sitecore/Sites pliku web.config.
0

Warto również sprawdzić stronę internetową \ App_Config \ Include \ SwitchMasterToWeb.config i zmienić nazwę/usunięcie, jeśli jest to wymagane, ponieważ sprawia, że ​​główna baza danych pojawia się jako sieć inaczej. Jako łatkę konfiguracyjną można ją łatwo pominąć podczas rozwiązywania problemów.