Rozwiązywanie problemów związanych z błędem zasad sprawdzania wiadomości SOAP w czasie działania

Przeglądasz dokumentację Apigee Edge.
Przejdź do Dokumentacja Apigee X.
informacje.

SourceMessageNotAvailable

Kod błędu

steps.messagevalidation.SourceMessageNotAvailable

Treść odpowiedzi na błąd

{
  "fault": {
    "faultstring": "source_var_name message is not
     available for[policy_name]",
    "detail": {
      "Errorcode":
       "steps.messagevalidation.SourceMessageNotAvailable"
     }
  }
}

Przykładowa treść odpowiedzi na błąd

{
  "fault": {
    "faultstring": "request message is not available for MessageValidation: SOAP-Message-Validation-1",
    "detail": {
      "errorcode": "steps.messagevalidation.SourceMessageNotAvailable"
    }
  }
}

Przyczyna

Ten błąd występuje, jeśli zmienna message określona w elemencie <Source> w zasadzie SOAPMessageValidation jest:

  • poza zakresem (niedostępne w ramach konkretnego procesu, w którym są realizowane zasady) lub
  • nie można rozwiązać (nie jest zdefiniowany)

Ten błąd może wystąpić na przykład wtedy, gdy element <Source> w zasadach SOAPMessageValidation ma wartość zmiennej, która nie istnieje w przepływie, w którym są wykonywane zasady.

Diagnostyka

  1. Określ nazwę zasady SOAPMessageValidation w miejscu, w którym występuje błąd, oraz nazwa zmiennej source z ciągu znaków błędu. Na przykład w tym ciągu błędu nazwa zasady SOAPMessageValidation to SOAP-Message-Validation-1, a zmienna source to request:

    "faultstring": "request message is not available for MessageValidation: SOAP-Message-Validation-1"
    
  2. W nieprawidłowym kodzie XML zasady SOAPMessageValidation sprawdź, czy nazwa zmiennej ustawiona w elemencie <Source> jest zgodna z nazwą zmiennej zidentyfikowaną w ciągu błędu (krok 1 powyżej).

    Na przykład ta zasada SOAPMessageValidation określa zmienną o nazwie request w elemencie <Source>, która odpowiada zawartości ciągu błędu:

    <MessageValidation async="false" continueOnError="false" enabled="true" name="SOAP-Message-Validation-1">
        <DisplayName>SOAP Message Validation-1</DisplayName>
        <Properties/>
        <Element namespace="http://schemas.xmlsoap.org/soap/prices">GetPriceResponse</Element>
        <SOAPMessage/>
        <Source>request</Source>
        <ResourceURL>xsd://Script-1.xsd</ResourceURL>
    </MessageValidation>
    
  3. Sprawdź, czy zmienna używana w elemencie <Source> jest zdefiniowana i dostępna w przepływie, w którym wykonywana jest zasada SOAPMessageValidation.

    Jeśli zmienna to:

    • poza zakresem (niedostępne w ramach konkretnego procesu, w którym są realizowane zasady) lub
    • nie można rozwiązać (nie jest zdefiniowany)

    to jest jego przyczyną.

    Na przykład załóżmy, że przedstawiona powyżej zasada SOAPMessageValidation jest wykonywana w przepływie odpowiedzi. Jednak zmienna request użyta w przykładzie powyżej elementu <Source> jest dostępna tylko w procesie żądania.

    W przepływie odpowiedzi nie ma zmiennej request, dlatego pojawia się ten błąd:

    "faultstring": "request message is not available for MessageValidation: SOAP-Message-Validation-1"
    

Rozdzielczość

Sprawdź, czy zmienna ustawiona w elemencie <Source> w zasadach SOAPMessageValidation, która nie została wykonana, jest zdefiniowana i występuje w przepływie, w którym są wykonywane te zasady.

Aby poprawić powyższy przykład, możesz zmodyfikować element <Source>, aby używać zmiennej response, która występuje w przepływie odpowiedzi:

<MessageValidation async="false" continueOnError="false" enabled="true" name="SOAP-Message-Validation-1">
    <DisplayName>SOAP Message Validation-1</DisplayName>
    <Properties/>
    <Element namespace="http://schemas.xmlsoap.org/soap/prices">GetPriceResponse</Element>
    <SOAPMessage/>
    <Source>response</Source>
    <ResourceURL>xsd://Script-1.xsd</ResourceURL>
</MessageValidation>

NonMessageVariable

Kod błędu

steps.messagevalidation.NonMessageVariable

Treść odpowiedzi na błąd

{
  "fault": {
    "faultstring": "Variable var_name does not resolve to a Message"
    "detail": {
      "errorcode": "steps.messagevalidation.NonMessageVariable"
    }
  }
}

Przykładowa treść odpowiedzi na błąd

{
  "fault": {
    "faultstring": "Variable message.content does not resolve to a Message",
    "detail": {
      "errorcode": "steps.messagevalidation.NonMessageVariable"
    }
  }
}

Przyczyna

Ten błąd występuje, jeśli element <Source> w zasadach SOAPMessageValidation ma wartość zmiennej, która nie jest typu Message.

Zmienne typu wiadomości reprezentują całe żądania i odpowiedzi HTTP. Wbudowane zmienne przepływu Apigee Edge request, response i message są typu Wiadomość. Więcej informacji o zmiennych wiadomości znajdziesz w artykule Informacje o zmiennych.

Diagnostyka

  1. Określ nazwę zmiennej, która nie przechodzi do typu komunikatu, na podstawie ciągu błędu. Na przykład w tym ciągu błędu nazwa zmiennej to message.content:

    "faultstring": "Variable message.content does not resolve to a Message"
    
  2. Sprawdź wszystkie zasady SOAPMessageValidation w przypadku konkretnego interfejsu API Proxy, w którym wystąpił błąd. Może istnieć co najmniej 1 zasada SOAPMessageValidation. Zidentyfikuj konkretną zasadę SOAPMessageValidation, w której zmienna określona w elemencie <Source> odpowiada nazwie zmiennej wskazanej w ciągu błędów (patrz krok 1 powyżej).

    Na przykład w tej regule element <Source> jest ustawiony na zmienną o nazwie message.content, która pasuje do wartości w ciągu błędu:

    <MessageValidation async="false" continueOnError="false" enabled="true" name="SOAP-Message-Validation-1">
        <DisplayName>SOAP Message Validation-1</DisplayName>
        <Properties/>
        <Element namespace="http://schemas.xmlsoap.org/soap/prices">GetPriceResponse</Element>
        <SOAPMessage/>
        <Source>message.content</Source>
        <ResourceURL>xsd://Script-1.xsd</ResourceURL>
    </MessageValidation>
    

    Zmienne message.content nie jest typu Message, dlatego pojawia się błąd:

    "faultstring": "Variable message.content does not resolve to a Message"
    

Rozdzielczość

Sprawdź, czy element <Source> w nieprawidłowej zasadzie SOAPMessageValidation jest ustawiony na zmienną typu Message istniejącą w przepływie, w którym jest wykonywana zasada.

Aby poprawić tę zasadę, możesz zmodyfikować element <Source>, aby określić zmienną typu Message. Na przykład w zasadzie nieudanego sprawdzania SOAPMessageValidation możesz określić element <Source> jako request:

<MessageValidation async="false" continueOnError="false" enabled="true" name="SOAP-Message-Validation-1">
    <DisplayName>SOAP Message Validation-1</DisplayName>
    <Properties/>
    <Element namespace="http://sample.com"> sampleObject</Element>
    <SOAPMessage/>
    <Source>request</Source>
    <ResourceURL>xsd://Script-1.xsd</ResourceURL>
</MessageValidation>

Niepowodzenie

Kod błędu

steps.messagevalidation.Failed

Treść odpowiedzi na błąd

{
  "fault": {
    "faultstring": "Variable var_name failed with reason: \"reason [Line varline_num
    "detail": {
      "errorcode": "steps.messagevalidation.Failed"
    }
  }
}

Przykładowa treść odpowiedzi na błąd

{
  "fault": {
    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expecting a child element but found none [Line 9]\"",
    "detail": {
      "errorcode": "steps.messagevalidation.Failed"
    }
  }
}

Przyczyna

Ten błąd występuje, jeśli zasada SOAPMessageValidation nie sprawdza weryfikacji wejściowego ładunku komunikatów względem schematu XSD lub definicji WSDL. Błąd występuje również wtedy, gdy komunikat ładunku zawiera nieprawidłowy format JSON lub XML.

Oto kilka możliwych przyczyn, które mogą powodować ten błąd:

Przyczyna Opis
Niezgodny ładunek XML Wejściowy ładunek XML jest niezgodny ze schematem XSD określonym w zasadzie SoapMessageValidation.
Niezgodny ładunek SOAP Wejściowy ładunek SOAP nie jest zgodny z definicją WSDL określoną w zasadzie SoapMessageValidation.
Nieprawidłowy format JSON lub XML Dane wejściowe SOAP nie zawierają poprawnie sformatowanego kodu XML ani JSON.

Przyczyna: niezgodność ładunku XML

Ten błąd występuje, jeśli wejściowy ładunek XML nie jest zgodny ze schematem XSD określona w elemencie <ResourceURL> zasady SoapMessageValidation.

Przykładowy komunikat o błędzie

{
  "fault": {
    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expecting a child element but found none [Line 9]\"",
    "detail": {
      "errorcode": "steps.messagevalidation.Failed"
    }
  }
}

Diagnostyka

  1. Określ nazwę zasady SOAPMessageValidation, przyczynę błędu oraz numer wiersza, w którym ładunek XML nie jest zgodny ze schematem XSD. Wszystkie te informacje znajdują się w ciągu tekstowym błędu. Na przykład w tym ciągu błędów nazwa zasady SOAPMessageValidation to SOAP-Message-Validation-1,, przyczyna błędu to Expecting a child element but found none [Line 9], a numer wiersza to 9.

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expecting a child element but found none [Line 9]\""
    
  2. Sprawdź regułę SOAPMessageValidation i potwierdź, że do sprawdzania wiadomości używa ona pliku definicji schematu XSD. Na przykład ta zasada SOAPMessageValidation zawiera w elemencie <ResourceURL> plik zasobów XSD:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <MessageValidation async="false" continueOnError="false" enabled="true" name="SOAP-Message-Validation-1">
        <DisplayName>SOAP Message Validation-1</DisplayName>
        <Properties/>
        <SOAPMessage/>
        <Source>request</Source>
        <ResourceURL>xsd://Script-1.xsd</ResourceURL>
    </MessageValidation>
    
  3. Sprawdź ładunek wejściowy na wierszu o numerze wskazanym w kroku 1, aby dowiedzieć się, co spowodowało błąd.

    Przykładowy ładunek XML wejściowy

    <?xml version="1.0"?>
    <soap:Envelope
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
    <soap:Body>
        <shipOrder
        xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance">
        <shipTo>
            <name>Karl Kalckstein</name>
        </shipTo>
        <items>
            <item>
                <title>I love APIs</title>
                <quantity>1</quantity>
                <price>2.90</price>
            </item>
        </items>
    </shipOrder>
    </soap:Body>
    </soap:Envelope>
    

    W przykładzie powyżej wiersz 9 zawiera tag końcowy </shipTo>.

  4. Aby sprawdzić, jak powinien wyglądać element <shipTo>, przejrzyj plik definicji schematu XML (Script-1.xsd) używany w zasadzie SOAPMessageValidation:

    ...
    <xsd:element name="shipTo" type="shipAddress"/>
    ...
    <xsd:complexType name="shipAddress">
    <xsd:sequence>
    <xsd:element name="name" type="xsd:string"/>
    <xsd:element name="street" type="xsd:string"/>
    <xsd:element name="address" type="xsd:string"/>
    <xsd:element name="country" type="xsd:string"/>
    </xsd:sequence>
    </xsd:complexType>
    ...
    

    Zgodnie z przykładowym plikiem XSD używanym do weryfikacji, element <shipTo> musi zawiera elementy podrzędne <name>, <street>, <address> i <country>. Jednak kod XML wejściowy ma tylko 1 element podrzędny, <name>. W efekcie pojawia się błąd:

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expecting a child element but found none [Line 9]\""
    

Rozdzielczość

Ten błąd weryfikacji można usunąć na 2 sposoby:

Rozwiązanie 1

Jeśli stwierdzisz, że definicja schematu XSD narzuca niepotrzebne ograniczenia i w elemencie <shipTo> wymagany jest tylko element podrzędny <name>, możesz zmodyfikować Script-1.xsd używany w zasadzie SOAPMessageValidation. Aby zweryfikować przykładowy ładunek danych, możesz zmodyfikować plik XSD w ten sposób:

...
<xsd:element name="shipTo" type="shipAddress"/>
...
<xsd:complexType name="shipAddress">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>

Rozwiązanie 2

Jeśli plik definicji XSD jest poprawny, można zmienić dane wejściowe XML, aby pasowały do xsd. Możesz na przykład zmodyfikować ładunek, aby był zgodny z dokumentem xsd w ten sposób:

<?xml version="1.0">
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Body>
    <shipOrder xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance">
    <shipTo>
        <name>Karl Kalckstein</name>
        <street>1020 Parkway</street>
        <address>Mountain View, CA 94043</address>
        <country>USA</country>
    </shipTo>
    <items>
        <item>
            <title>I love APIs</title>
            <quantity>1</quantity>
            <price>2.90</price>
        </item>
    </items>
</shipOrder>
</soap:Body>
</soap:Envelope>

Przyczyna: niezgodny ładunek SOAP

Ten błąd występuje, gdy wejściowy ładunek SOAP nie jest zgodny z definicją WSDL określoną w elemencie <ResourceURL> w zasadach SoapMessageValidation.

Przykładowy komunikat o błędzie

{
  "fault": {
    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Element name mismatch. Wildcard? [Line 11]\"",
    "detail": {
      "errorcode": "steps.messagevalidation.Failed"
    }
  }
}

Diagnostyka

  1. Określ nazwę zasady SOAPMessageValidation, przyczynę błędu i numer wiersza, w którym ładunek SOAP nie odpowiada definicji WSDL. Wszystkie te informacje możesz znaleźć w ciągu znaków błędu. Na przykład w tym ciągu błędów nazwa zasady SOAPMessageValidation to SOAP-Message-Validation-1, przyczyna niepowodzenia to \"Element name mismatch. Wildcard? [Line 11]\"", a numer wiersza to 11:

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Element name mismatch. Wildcard? [Line 11]\""
    
  2. Sprawdź regułę SOAPMessageValidation i potwierdź, że do sprawdzania wiadomości używa ona schematu wsdl. Na przykład ta zasada SOAPMessageValidation zawiera w elemencie <ResourceURL> plik zasobów wsdl:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <MessageValidation async="false" continueOnError="false" enabled="true" name="SOAP-Message-Validation-1">
        <DisplayName>SOAP Message Validation-1</DisplayName>
        <Properties/>
        <SOAPMessage/>
        <Source>request</Source>
     <ResourceURL>wsdl://SOAP-Message-Validation-1.wsdl</ResourceURL>
    </MessageValidation>
    
  3. Sprawdź ładunek wejściowy na wierszu o numerze wskazanym w kroku 1, aby dowiedzieć się, co spowodowało błąd.

    Przykładowe wejściowe ładunki SOAP

    <?xml version="1.0"?>
    <soap:Envelope
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
    soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
    <soap:Body>
    <shipOrder
    xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance">
      <shipTo>
        <name>Karl Kalckstein</name>
        <street>1020 Parkway</street>
        <address>Mountain View, CA 94043</address>
        <country>USA</country>
      </shipTo>
      <items>
        <item>
          <title>I love APIs</title>
          <quantity>1</quantity>
          <price>2.90</price>
        </item>
      </items>
    

    W przykładzie powyżej wiersz 11 zawiera element podrzędny <country> pod elementem <shipTo>.

  4. Sprawdź plik definicji WSDL (SOAP-Message-Validation-1.wsdl) używany w zasadzie SOAPMessageValidation, aby sprawdzić, co może być nie tak z elementem podrzędnym <country> w elemencie <shipTo>:

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
        <wsdl:types>
          <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="shipOrder" type="order"/>
    <xsd:complexType name="order">
    <xsd:sequence>
    <xsd:element name="shipTo" type="shipAddress"/>
    <xsd:element name="items" type="cdItems"/>
    </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="shipAddress">
    <xsd:sequence>
    <xsd:element name="name" type="xsd:string"/>
    <xsd:element name="street" type="xsd:string"/>
    <xsd:element name="address" type="xsd:string"/>
    </xsd:sequence>
    ...
    

    Zgodnie z definicją WSDL użytą do weryfikacji element <shipTo> nie ma elementu podrzędnego <country>. W efekcie pojawia się błąd:

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Element name mismatch. Wildcard? [Line 11]\""
    

Rozdzielczość

Ten błąd weryfikacji można usunąć na 2 sposoby:

Rozwiązanie 1

Jeśli stwierdzisz, że używana definicja WSDL jest nieprawidłowa, możesz zmienić SOAP-Message-Validation-1.wsdl używane w zasadzie SOAPMessageValidation. Aby sprawdzić przykład ładunku powyżej, możesz zmodyfikować plik w ten sposób:

...
<xsd:complexType name="shipAddress">`
...
<sequence>
    <element name="name" type="xsd:string"/>
    <element name="street" type="xsd:string"/>
    <element name="address" type="xsd:string"/>
    <element name="country" type="xsd:string"/>
</sequence>

Rozwiązanie 2

Jeśli definicja WSDL jest prawidłowa, można zmienić wejściowy ładunek SOAP w taki sposób, aby był zgodny z definicją WSDL.

Możesz na przykład zmodyfikować wejściowy ładunek SOAP w ten sposób:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Body>
<shipOrder xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance">
    <shipTo>
        <name>Karl Kalckstein</name>
        <street>1020 Parkway</street>
        <address>Mountain View, CA 94043</address>
    </shipTo>
    <items>
        <item>
            <title>I love APIs</title>
            <quantity>1</quantity>
            <price>2.90</price>
        </item>
    </items>

Przyczyna: nieprawidłowy kod JSON lub XML

Ten błąd występuje, jeśli wejściowe dane SOAP nie są zgodne ze specyfikacją WSDL określoną w elemencie <ResourceURL> w zasadach SoapMessageValidation.

Przykładowy komunikat o błędzie

{
  "fault": {
    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expected <\/title> at line 15(possibly  around char 420)\"",
    "detail": {
      "errorcode": "steps.messagevalidation.Failed"
    }
  }
}

Diagnostyka

  1. Określ nazwę zasady SOAPMessageValidation, przyczynę błędu oraz numer wiersza ładunku XML, który nie jest zgodny z definicją WSDL. Wszystkie te informacje możesz znaleźć w ciągu znaków błędu. Na przykład w poniższym ciągu błędu nazwa zasady SOAPMessageValidation to SOAP-Message-Validation-1, przyczyna błędu to Expected </title> at line 15(possibly around char 420):, a numer wiersza to 15.

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expected </title> at line 15(possibly  around char 420)\""
    
  2. Aby dowiedzieć się, co spowodowało błąd, sprawdź dane wejściowe na linii wskazanej w kroku 1.

    Przykładowy ładunek SOAP wejściowy

    <?xml version="1.0"?>
    <soap:Envelope
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
    soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
    <soap:Body>
    <shipOrder xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance">
      <shipTo>
        <name>Karl Kalckstein</name>
        <street>1020 Parkway</street>
        <address>Mountain View, CA 94043</address>
        <country>USA</country>
      </shipTo>
      <items>
        <item>
          <title>I love APIs</titles>
          <quantity>1</quantity>
          <price>2.90</price>
        </item>
      </items>
    </shipOrder>
    </soap:Body>
    </soap:Envelope>
    

    W przykładzie pokazanym powyżej wiersz 15 w pliku XML zawiera element <title>, ale nie jest zamykany za pomocą tagu końcowego </title>.

Rozdzielczość

Aby naprawić ten błąd, sprawdź, czy ładunek wejściowy jest prawidłowy i poprawnie sformatowany.

Możesz na przykład zmodyfikować wejściowy ładunek XML w ten sposób:

...
</shipTo>
<items>
  <item>
    <title>I love APIs</title>
    <quantity>1</quantity>
    <price>2.90</price>
  </item>
</items>
...