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

Przeglądasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X.
info

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 jest wykonywana zasada) lub
  • nie może zostać rozwiązana (nie jest zdefiniowana).

Ten błąd występuje na przykład wtedy, gdy element <Source> w zasadzie SOAPMessageValidation jest ustawiony na zmienną, której nie ma w przepływie, w którym jest wykonywana zasada.

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 podaną 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. Określ, czy zmienna używana w elemencie <Source> jest zdefiniowana i dostępna w procesie, 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ść

Upewnij się, że zmienna ustawiona w elemencie <Source> nieudanej zasady SOAPMessageValidation jest zdefiniowana i istnieje w przepływie, w którym jest wykonywana zasada.

Aby poprawić przykład powyżej, możesz zmodyfikować <Source> element do użycia zmienną response istniejącą 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 zasadzie SOAPMessageValidation jest ustawiony na zmienną, która nie jest typu Message.

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

Diagnostyka

  1. Zidentyfikuj nazwę zmiennej, która nie jest rozpoznawana jako typ wiadomości z ciągu błędów. Na przykład w tym ciągu błędów nazwa zmiennej to message.content:

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

    Na przykład ta zasada ustawia element <Source> na zmienną o nazwie message.content, 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>message.content</Source>
        <ResourceURL>xsd://Script-1.xsd</ResourceURL>
    </MessageValidation>
    

    Zmienna message.content nie jest typu Wiadomość, więc pojawia się błąd:

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

Rozdzielczość

Upewnij się, że element <Source> w nieudanej regule SOAPMessageValidation jest ustawiony na zmienną typu Message, która występuje w przepływie, w którym działa zasada.

Aby poprawić tę zasadę, możesz zmodyfikować element <Source>, aby określić zmienną typu Message. Na przykład w przypadku nieudanej zasady 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 tego błędu:

Przyczyna Opis
Niezgodny ładunek XML Wejściowy ładunek XML jest niezgodny ze schematem XSD określonym w zasadzie SoapMessageValidation.
Niezgodny ładunek SOAP Dane wejściowe SOAP nie są zgodne z definicją WSDL określoną w zasadach SoapMessageValidation.
Nieprawidłowy format JSON lub XML Wejściowy ładunek SOAP nie zawiera 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 znaków błędu. Na przykład w tym ciągu błędu 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ź zasadę SOAPMessageValidation i potwierdź, że do weryfikacji wiadomości używa 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. Aby dowiedzieć się, co spowodowało błąd, sprawdź dane wejściowe na linii wskazanej w kroku 1.

    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. Sprawdź plik definicji schematu XML (Script-1.xsd) używany w zasadzie SOAPMessageValidation, aby zobaczyć, jak powinien wyglądać element <shipTo>:

    ...
    <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 wejściowy ładunek XML ma tylko 1 element podrzędny: <name>. W rezultacie 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 sprawdzić przykład ładunku powyżej, 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 prawidłowy, można zmienić wejściowy ładunek XML tak, aby był zgodny z plikiem xsd. Możesz na przykład zmodyfikować ładunek, aby był zgodny z xsd:

<?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: niezgodność ładunku SOAP

Ten błąd występuje, gdy wejściowy ładunek SOAP nie jest zgodny ze wzorcem WSDL określonym w elemencie <ResourceURL> zasady 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 oraz numer wiersza, w którym ładunek SOAP nie jest zgodny z definicją WSDL. Wszystkie te informacje możesz znaleźć w ciągu znaków błędu. Na przykład w tym ciągu błędu nazwa zasady SOAPMessageValidation to SOAP-Message-Validation-1, przyczyna błędu 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ź zasadę SOAPMessageValidation i upewnij się, że do weryfikacji wiadomości używa 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żywaną do weryfikacji element <shipTo> nie ma elementu podrzędnego <country>. W rezultacie 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żywaną 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 poprawna, można zmienić wejściowy ładunek SOAP, aby pasował do definicji 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 format JSON lub XML

Ten błąd występuje, gdy wejściowy ładunek SOAP nie jest zgodny ze wzorcem WSDL określonym w elemencie <ResourceURL> zasady 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. 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</titles>
          <quantity>1</quantity>
          <price>2.90</price>
        </item>
      </items>
    </shipOrder>
    </soap:Body>
    </soap:Envelope>
    

    W powyższym przykładzie wiersz 15 wejściowego kodu XML zawiera element <title>, ale nie jest zamknięty tagiem końcowym </title>.

Rozdzielczość

Aby rozwiązać ten problem, upewnij się, że ładunek wejściowy jest prawidłowy i prawidłowo 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>
...