Navigation and service panel


Content

This text is fallbacked from the German Version. If you need use Google Translate


Invariant Language

By Christian Stampfli on 13. September 2012, No comments

Unter bestimmten Umständen (die genaue Ursache ist leider nicht bekannt), kann ein Item eine ungültige Sprachversion erhalten. Für die Bearbeitung im Content Editor ist dies kein Problem - jedoch stürzt die Workbox ab.

Anhand des angesprochenen Absturzes lies sich die genaue Fehlerquelle leider nicht lokalisieren:

Workbox Error

Auch im Stacktrace fanden sich keine (direkt) hilfreichen Hinweise. Einzig folgende Zeile zeigt etwas deutlicher auf, wo der Fehler seine Ursache hatte.

Sitecore.Shell.Framework.CommandBuilders.CommandBuilder.Add(String key, String value)

Es führte also nichts um die Analyse der Logfiles herum. Da der Fehler in der Workbox auftrat (der Content Editor funktionierte zu jedem Zeitpunkt einwandfrei), musste ein direkter Zusammenhang mit einem Item bestehen und es konnte sich nicht um einen "grundsätzlichen" Sitecore-Fehler handeln.

Da bei diesem Sitecore-Projekt regelmässig via Workflow die in der Workbox vorliegenden Items abgearbeitet werden, konnten wir davon ausgehen, dass der Fehler in naher Vergangenheit verursacht worden sein musste. Wir suchten also nach Items, bei welchen der Workflow-Status geändert wurde.

Wir prüften alle Items und suchten nach Unregelmässigkeiten. Bei einem dieser Items entdeckten wir dann eine unerwartete Auswahl beim Sprachversion-Dropdown:

Invariant Language Dropdown

Es war nicht nur eine Sprachversion hinterlegt, welche nicht in der Site-Konfiguration vorhanden ist - es war eine Sprachversion einer nicht existierenden Sprache hinterlegt. Wir vermuteten, dass dies mit grosser Wahrscheinlichkeit die Ursache des Problems mit der Workbox ist.

Die nächste Frage war: Wie können wir das Problem beheben?
Parallel zu unserer eigenen Recherche haben wir uns noch mit dem Sitecore-Support in Verbindung gesetzt, welcher in Rekordzeit geantwortet hat.

Unsere eigene Rechere und der Sitecore-Support führten uns zu folgenden möglichen Lösungen:

1. Löschen des Items

Der einfachste Weg ist simpel: Das Item im Content Editor löschen.

Das Problem ist mit dieser simplen Variante grundsätzlich gelöst. Die Konsequenz ist jedoch, dass das komplette Item weg ist. Gerade bei Seiten mit verschiedenen (bereits vorhandenen) Sprachversionen kann der Aufwand um das Item neu zu erstellen je nachdem sehr gross sein.

2. SQL-Query ausführen

Der Sitecore-Support schlägt vor, dass zuerst via SQL-Query die fehlerhaften Sprachversionen gesucht werden:

SELECT * FROM [VersionedFields] WHERE [Language] = ''

Findet diese Abfrage Einträge, können diese bedenkenlos via weiterem SQL-Query gelöscht werden:

DELETE FROM [VersionedFields] WHERE [Language] = ''

Beide Abfragen müssen auf der Master-Datenbank ausgeführt werden.
Der Nachteil dieser Variante ist, dass man direkten Zugriff auf den SQL-Server benötigt. In unserem Fall war das nicht ohne weiteres möglich. Es ist aber selbstverständlich die effektivste Variante, welche auch keine Seiteneffekte mit sich bringt.

3. Item manuell bearbeiten

Unsere Recherche führte uns zusätzlich zu den bereits erwähnten Möglichkeiten noch zu folgendem Vorgehen:

Ist das fehlerhafte Item gefunden, wird es via Developer-Toolbar serialisiert und somit ins Dateisystem gespeichert:

Serialize Item

Im Data-Verzeichnis des Projekts befindet sich nun im Ordner "serialization" die Ordnerstruktur des exportierten Items. Zuunterst in der Ordnerstruktur findet sich dann das betreffende Item als .item-Datei.

In dieser Datei befinden sich nun - in Textform - sämtliche Sprachversionen des Items. Nebst den allgemeinen Informationen zum Item gibt es für jede (Sprach-)Version einen eigenen Abschnitt. Dieser Abschnitt sollte beispielsweise wie folgt beginnen:

----version----
language: de
version: 1
revision: 66bbcc14-251b-4814-8f72-1d76db891a82

Das fehlerhafte Item beinhaltet nebst diesen "normalen" Einträgen auch folgenden Eintrag:

----version----
language:
version: 1
revision: dcbcd88a-f3fb-45ec-95f4-6e66c9a15236

Wie ersichtlich ist, findet sich hier die Definition für die "Invariant Language" :-)

Um diese fehlerhafte Version zu löschen, müssen alle zugehörigen Einträge in der Datei entfernt werden.
Dies wird am einfachsten erreicht, in dem alle Zeilen bis zum nächsten Version-Eintrag gelöscht werden.

Im Prinzip könnte man dieses nachbearbeitete Item bereits wieder importieren. Leider ignoriert Sitecore beim Import, dass die ungültige Sprachversion gelöscht wurde. Die Lösung für dieses Problem ist: Das Item im Content Editor löschen und komplett neu importieren. Der Import kann wiederum via Developer-Toolbar gestartet werden:

Update Database

Hinweis: Diese Funktion importiert ALLE Items, welche sich im serialization-Ordner befinden. Im Zweifelsfall sollten vorher alle anderen Items/Ordner (temporär) an einen anderen Ort verschoben werden, damit keine bestehenden Items überschrieben werden.

Nach dem Import des bearbeiteten Items ist dieses nun im Content Editor wieder ersichtlich und die fehlerhafte Sprachversion ist verschwunden. Alle anderen Sprachversionen sind jedoch noch vorhanden.

Diese Lösung ist zugegeben etwas umständlicher als die beiden vorherigen. Der Vorteil ist jedoch, dass "nur" Zugriff auf den Webserver benötigt wird. Im Idealfall kann sogar via Netzwerkshare auf den serialization-Ordner zugegriffen werden und es ist nicht einmal direkter Zugriff auf den Webserver nötig.

Fazit

Alle drei beschriebenen Lösungswege verfolgen zwar das gleiche Ziel, haben jedoch verschiedene Einschränkungen und Vor- bzw. Nachteile.

In einer Testumgebung würde ich sicherlich das Item einfach löschen.
In einer produktiven Umgebung ist der Weg via SQL-Query natürlich schneller und genau so sauber wie der Weg via Serialisierung. Aus Sicherheitsgründen ist jedoch bei vielen Umgebungen ein direkter Zugriff auf den SQL-Server nicht möglich, weshalb die aufwändigere Lösung zum Einsatz kommt.

Hinzu kommt, dass bei den Varianten 1 und 3 das Item bekannt sein muss - unter Umständen ist dies nicht ohne riesigen Aufwand möglich. Variante 2 kann hier punkten, da das SQL-Query unabhängig ausgeführt werden kann.

Categories  Troubleshooting Tags  Workbox  Sprachversion  Item

No comments

Add your comment

Your email address will not be published. Required fields are marked *

*