091502CC8D7F487BA52A08145ED03720
  • Thomas Pollinger
  • 01.06.2018
  • DE

Root Cause Analysis: "PageIndex. GetPageIndexByPage ... Object reference not set to an instance of an object"

Manchmal fragt man sich selbst, warum man das gemacht hat. Doch dann mit einem zweiten oder dritten Blick auf die Sache wird klar, der Fehler sitzt doch mal wieder vor dem Rechner. Denn wenn man immer von einer idealen Welt ausgeht, wird man nicht selten von neuen Varianten überrascht. Welche man garnicht oder nur in Teilen berücksichtigt hat. Wie in diesem Fall, bei dem sehr viel Zeit und Geduld notwendig war.


Regel 39

Du fixt einen Bug, doch der Fix verursacht drei weitere Bugs. (Entwicklerweisheit)


Verhalten

Diese nachfolgenden Fehlermeldung kommt aus dem wsms.log:

Reddot.CMS.Project.Navigation.PageIndex.GetPageIndexByPage (:0)
Locals: Project: {GUID}; Language: DEU; 
System.NullReferenceException: Object reference not set to an instance of an object.
   bei Reddot.CMS.Project.Navigation.PageIndex.GetPageIndexByPage(IPage page, ISession session)

Problem dabei ist, dass man leider keine Angabe über die Content-Klasse oder Seite bekommt.


Ursache

Die Ursache ist, sofern man sie dann gefunden hat, logisch. Denn in bestimmten Fällen ist die Abfrage des Index außerhalb des Navigation-Manager-Index und schlägt daher fehl.

<reddot:cms>
    <if>                  
        <query valuea="Context:Indexes.GetIndexByPage(Context:CurrentMasterPage.MainLink.OwnerPage).GetRootIndex().Id" operator="==" valueb="Context:Indexes.RootIndexList[Int:0].Id">                    
            <htmltext>
                <div class="breadcrumbs">
                    <div class="container">                
                        <ul class="breadcrumb">
                            <li><a href="<%!! Context:CurrentMasterPage.MainLink.OwnerPage.MainLink.OwnerPage.GetUrl() !!%>"><%!! Context:CurrentMasterPage.MainLink.OwnerPage.MainLink.OwnerPage.Headline !!%></a></li>                        
                            <li class="active"><%!! Context:CurrentMasterPage.Headline !!%></li>
                        </ul>
                    </div>
                </div>                                        
            </htmltext>
        </query>
    </if>
</reddot:cms>

Dieser Fehler trat nur auf, wenn die Seite nicht im Navigationsbaum hing. Also eine Freie Seite ist oder an einem Strukturelement außerhalb des Navigation-Managers verknüpft war.


Lösung

Da es direkt im Management-Server keine saubere und kontrollierte Möglichkeit gibt, zu prüfen ob der Index vorhanden ist, bevor man ihn abfragt. Muss man in die Trickkiste greifen und andere Abhängigkeiten prüfen, welche jedoch von Projekt zu Projekt unterschiedlich sein können.

<if>
    <query valuea="Context:CurrentPage.MainLink.LinkName" operator="==" valueb="Str:lst_SubItems">
<navigation areaname="Breadcrumb" usehiddenindexes="Bool:True" userights="Bool:False" useParallelRenderThreadsForNavigationLevels="Bool:True" />      
    </query>
    <query valuea="Context:CurrentPage.MainLink.LinkName" operator="==" valueb="Str:lst_EditWebContent">
<navigation areaname="Breadcrumb" usehiddenindexes="Bool:True" userights="Bool:False" useParallelRenderThreadsForNavigationLevels="Bool:True" />      
    </query>
    <query type="else">
<navigation areaname="BreadcrumbArticle" usehiddenindexes="Bool:True" pageguid="Context:CurrentPage.MainLink.OwnerPage.MainLink.OwnerPage.Id" userights="Bool:False" useParallelRenderThreadsForNavigationLevels="Bool:True" />
        <htmltext>                <li class="active"><%!! Context:CurrentPage.Headline !!%></li></htmltext>
    </query>
</if>

In diesem Fall haben ich einfach geprüft, ob die Seite an der erwarteten Struktur bzw. an dem dazu notwendigen Struktur-Elemente hängt. Und wenn dies nicht der Fall war, dann wurde einfach die Abfrage des Navigations-Index übersprungen.


Über den Autor:
Thomas Pollinger

... ist Senior Site Reliability Engineer bei der Vodafone GmbH in Düsseldorf. Seit dem Jahr 2007 betreut er zusammen mit seinen Kollegen die OpenText- (vormals RedDot-) Plattform Web Site Management für die deutsche Konzernzentrale.

Er entwickelt Erweiterungen in Form von Plug-Ins und PowerShell Skripten. Seit den Anfängen in 2001 (RedDot CMS 4.0) kennt er sich speziell mit der Arbeitweise und den Funktionen des Management Server aus.