091502CC8D7F487BA52A08145ED03720
  • Thomas Pollinger
  • 16.08.2017
  • DE/EN

Root Cause Analysis: "...Index and length must refer to a location within the string."

Über die Jahre bekommt man immer wieder die eigenartigsten Fehlermeldungen zu Gesicht. Auch wenn man meint, schon alle einmal gesehen zu haben. So kann man sich auch mal sehr lange mit der Suche nach der Ursache aufhalten, wie in diesem Fall :)


Regel 9

Ein Computerprogramm tut das, was man ihm sagt und nicht was du willst.


Meldung

Severity: Error
Component: Navigation
Category: Application
Source: Reddot.CMS.Rendering.Objects.ObjectReflector.GetObject (:0)
Message:
Locals: Project: {GUID}; ProjectVariant: {GUID}; Language(Page): {GUID}; Page(ID/UUID): {ID}; ContentClass: {GUID}; RenderMode: {Preview|SmartEdit|Publish}; RequestId: {ID};
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.ArgumentOutOfRangeException: Index and length must refer to a location within the string.
Parameter name: length
   at System.String.Substring(Int32 startIndex, Int32 length)
   --- End of inner exception stack trace ---
   at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
   at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)
   at Reddot.CMS.Rendering.Objects.ObjectReflector.GetObject(String[]& objectArray, Int32 startDepth, Object value, IObjectLoadManager objectLoadManager)

Ursache

Für diese Meldung ist die Ursache, dass das Textelement valueText mit zwei unterschiedlichen Methoden, bei .Length und .Substring(), für die Inhaltsabfrage abgefragt wurden. Bei dem If-Query mit .Length wurde .Value und beim Substring .GetHtml() verwendet. Diese beiden Methoden liefern jeweils unterschiedliche Ergebnisse bei den Inhalten zurück und führen daher zu dieser Fehlermeldung:

<reddot:cms>
  <if>
    <query valuea="Context:CurrentPage.GetElementByName(String:valueText).Value.Length" operator="gt" valueb="Int:20">
      <htmltext><%!! Context:CurrentPage.GetElementByName(String:valueText).GetHtml().Substring(Int:0,Int:20) !!%></htmltext>
    <query>
  </if>
</reddot:cms>

Lösung

Immer darauf achten, dass die Abfrage des Inhalts mit der selben Methode durchgeführt wird, innerhalb eines Blocks und für das gleiche Element:

<reddot:cms>
  <if>
    <query valuea="Context:CurrentPage.GetElementByName(String:valueText).Value.Length" operator="gt" valueb="Int:20">
      <htmltext><%!! Context:CurrentPage.GetElementByName(String:valueText).Value.Substring(Int:0,Int:20) !!%></htmltext>
    <query>
  </if>
</reddot:cms>
<reddot:cms>
  <if>
    <query valuea="Context:CurrentPage.GetElementByName(String:valueText).GetHtml().Length" operator="gt" valueb="Int:20">
      <htmltext><%!! Context:CurrentPage.GetElementByName(String:valueText).GetHtml().Substring(Int:0,Int:20) !!%></htmltext>
    <query>
  </if>
</reddot:cms>

Ü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.