Fehlerbehebung für Laufzeitfehler von "Nachricht zuweisen"

Sie lesen gerade die Dokumentation zu Apigee und Apigee Hybrid.
Apigee Edge-Dokumentation aufrufen.

UnresolvedVariable

Fehlercode

steps.assignmessage.UnresolvedVariable

Fehlerantworttext

{
    "fault": {
        "faultstring": "AssignMessage[policy_name]: unable to resolve variable [variable_name]",
        "detail": {
            "errorcode": "steps.assignmessage.UnresolvedVariable"
        }
    }
}

Ursache

Dieser Fehler tritt bei einer Variablen auf, die in der Richtlinie "Nachricht zuweisen" angegeben ist, wenn die Variable

  • außerhalb des Gültigkeitsbereichs liegt (nicht in dem spezifischen Ablauf verfügbar ist, in dem die Richtlinie ausgeführt wird) oder
  • nicht aufgelöst werden kann (nicht definiert ist).

Dieser Fehler tritt beispielsweise auf, wenn die Richtlinie "Nachricht zuweisen" im Anfrageablauf ausgeführt wird, das Attribut source im Element <Copy> jedoch auf die Variable response oder error oder eine andere benutzerdefinierte Variable festgelegt ist, die im Anfrageablauf nicht vorhanden ist.

Diagnose

  1. Ermitteln Sie die Richtlinie "Nachricht zuweisen", in der der Fehler aufgetreten ist, sowie den Namen der nicht verfügbaren Variable. Sie finden beide Elemente im Element faultstring der Fehlerantwort.

    Beispiel: Im folgenden faultstring lautet der Richtlinienname googleBook und die Variable var:

    "faultstring": "AssignMessage[googleBook]: unable to resolve variable var"
    
  2. Prüfen Sie in der XML-Datei der Richtlinie "Nachricht zuweisen", ob der Name der verwendeten Variablen mit dem Variablennamen übereinstimmt, der im Fehlerstring angegeben ist (Schritt 1 oben). Beispiel: Die folgende Richtlinie legt die Variable var als Quellattribut im Element <Copy> fest, was mit dem Inhalt von faultstring übereinstimmt:

    <AssignMessage async="false" continueOnError="false" enabled="true" name="Assign-Message-1">
       <DisplayName>googleBook</DisplayName>
       <Properties />
       <Copy source="var">
          <Headers>
             <Header name="user-agent" />
          </Headers>
       </Copy>
       <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
       <AssignTo createNew="true" transport="http" type="request">googleBookReq</AssignTo>
    </AssignMessage>
    
  3. Prüfen Sie, ob die Variable definiert und in dem Ablauf verfügbar ist, in dem die Richtlinie "Nachricht zuweisen" ausgeführt wird.

  4. Wenn die Variable entweder:

    1. außerhalb des Gültigkeitsbereichs liegt (nicht in dem spezifischen Ablauf verfügbar ist, in dem die Richtlinie ausgeführt wird) oder
    2. nicht aufgelöst werden kann (nicht definiert ist)

    dann ist das die Ursache für den Fehler.

    Angenommen, die oben gezeigte Richtlinie "Nachricht zuweisen" wird im Anfrageablauf ausgeführt. Prüfen Sie, ob die Variable var in einer der Richtlinien definiert ist, die vor der Richtlinie "Nachricht zuweisen" im Anfrageablauf ausgeführt werden. Wenn die Variable nicht definiert wurde, erhalten Sie folgenden Fehlercode:

    steps.assignmessage.UnresolvedVariable
    

Lösung

Achten Sie darauf, dass die in der Richtlinie referenzierte Variable vorhanden und in dem spezifischen Ablauf verfügbar ist, in dem die Richtlinie „Nachricht zuweisen“ ausgeführt wird.

Um die oben gezeigte Beispielrichtlinie zu korrigieren, können Sie das Quellattribut im Element <Copy> in die Anfragevariable oder eine andere benutzerdefinierte Variable des Typs "message" ändern, die im Anfrageablauf vorhanden ist.

<AssignMessage async="false" continueOnError="false" enabled="true" name="Assign-Message-1">
   <DisplayName>googleBook</DisplayName>
   <Properties />
   <Copy source="request">
      <Headers>
         <Header name="user-agent" />
      </Headers>
   </Copy>
   <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
   <AssignTo createNew="true" transport="http" type="request">googleBookReq</AssignTo>
</AssignMessage>

VariableOfNonMsgType

Fehlercode

steps.assignmessage.VariableOfNonMsgType

Fehlerantworttext

{
    "fault": {
        "faultstring": "AssignMessage[policy_name]: value of variable [variable] is not of type Message",
        "detail": {
            "errorcode": "steps.assignmessage.VariableOfNonMsgType"
        }
    }
}

Ursache

Dieser Fehler tritt auf, wenn für das Attribut source im Element <Copy> eine Variable festgelegt ist, die nicht vom Typ message ist.

Nachrichtentypvariablen stellen ganze HTTP-Anfragen und -Antworten dar. Die integrierten Ablaufvariablen request, response und message sind vom Typ "Message". Weitere Informationen zu Nachrichtenvariablen finden sich in der Variablenreferenz.

Diagnose

  1. Ermitteln Sie die Richtlinie "Nachricht zuweisen", in der der Fehler aufgetreten ist, sowie den Namen der Variable, deren Typ ungültig ist. Sie finden beide Elemente im Element faultstring der Fehlerantwort. Beispiel: Im folgenden faultstring lautet der Richtlinienname GenerateGeocodingRequest und die Variable PostalCode:

    "faultstring": "AssignMessage[GenerateGeocodingRequest]: value of variable PostalCode is not of type Message"
    
  2. Prüfen Sie in der XML-Datei der Richtlinie "Nachricht zuweisen", ob der Name der verwendeten Variablen im Element <Copy> mit dem Variablennamen übereinstimmt, der im Fehlerstring angegeben ist (Schritt 1 oben). Beispiel: Die folgende Richtlinie legt die Variable PostalCode als Quellattribut fest, was mit dem Inhalt von faultstring übereinstimmt:

    <AssignMessage name="GenerateGeocodingRequest">
       <AssignTo createNew="true" type="request">GeocodingRequest</AssignTo>
       <AssignVariable>
          <Name>PostalCode</Name>
          <Ref>request.queryparam.postalcode</Ref>
       </AssignVariable>
       <AssignVariable>
          <Name>Country</Name>
          <Ref>request.queryparam.country</Ref>
       </AssignVariable>
       <Copy source="PostalCode">
          <QueryParams>
             <QueryParam name="q" />
          </QueryParams>
       </Copy>
    </AssignMessage>
    
  3. Bestimmen Sie, ob diese Variable vom Typ "message" ist oder nicht:

    1. Suchen Sie den Code innerhalb des API-Proxy-Bundles, wo die Variable zuerst definiert wurde.
    2. Nachdem Sie die Richtlinie ermittelt haben, in der die Variable zuerst definiert und ausgefüllt wird, müssen Sie den Typ dieser Variable so bestimmen:
      1. Prüfen Sie den Wert des Typattributs (falls vorhanden).
      2. Wenn das Typattribut nicht vorhanden ist, wird die Variable als String betrachtet.
    3. Ist der Typ der Variablen nicht "Message" (z. B. ein String), so ist dies die Ursache des Fehlers. Weitere Informationen zu gängigen Variablen und ihren Typen finden Sie in der Variablenreferenz.

    Betrachten Sie beispielsweise die Variable PostalCode in der obigen XML-Datei. Sie erhält den Wert der Ablaufvariablen request.queryparam.postalcode im Element <AssignVariable>. Dieser Wert ist ein String, da in der Variablenzuweisung kein Typattribut vorhanden ist.

    Denken Sie nun daran, dass die Variable "PostalCode" im Element <Copy> der Richtlinie "Nachricht zuweisen" verwendet wird:

    <Copy source="PostalCode">
       <QueryParams>
          <QueryParam name="PostalCode" />
       </QueryParams>
    </Copy>
    

    Da „PostalCode“ nicht vom Typ „message“ ist (in diesem Beispiel ein String), erhalten Sie den Fehlercode:

    steps.assignmessage.VariableOfNonMsgType
    

Lösung

Sorgen Sie dafür, dass das Attribut source im Element <Copy> der fehlgeschlagenen Richtlinie "Nachricht zuweisen" auf eine vorhandene Ablaufvariable vom Typ message festgelegt ist.

Um die Richtlinie zu korrigieren, können Sie das Attribut source im Element <Copy> so ändern, dass eine Variable vom Typ "message" angegeben wird. Wenn die Richtlinie "Nachricht zuweisen" beispielsweise im Anfrageablauf ausgeführt werden soll, können Sie die Nachrichtentypvariable request oder eine beliebige benutzerdefinierte Variable vom Typ "message" verwenden.

<AssignMessage name="GenerateGeocodingRequest">
   <AssignTo createNew="true" type="request">GeocodingRequest</AssignTo>
   <AssignVariable>
      <Name>PostalCode</Name>
      <Ref>request.queryparam.postalcode</Ref>
   </AssignVariable>
   <AssignVariable>
      <Name>Country</Name>
      <Ref>request.queryparam.country</Ref>
   </AssignVariable>
   <Copy source="request">
      <QueryParams>
         <QueryParam name="PostalCode" />
      </QueryParams>
   </Copy>
</AssignMessage>