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

SourceMessageNotAvailable

Kod błędu

steps.messagevalidation.SourceMessageNotAvailable

Treść odpowiedzi o błędzie

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

Przykładowa treść odpowiedzi dotyczącej błędu

{
  "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> zasady SOAPMessageValidation ma jedną z tych wartości:

  • Poza zakresem (niedostępne w konkretnym procesie, w którym jest wykonywana zasada) lub
  • Nie można rozwiązać (nie określono)

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

Diagnostyka

  1. Wskaż nazwę zasady SOAPMessageValidation, w którym występuje błąd, oraz nazwę zmiennej source z ciągu błędu. Na przykład w tym ciągu znaków 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 niepowodzeniu zasad SOAPMessageValidation w pliku XML sprawdź, czy nazwa zbioru zmiennej w elemencie <Source> odpowiada nazwie zmiennej zidentyfikowanej w ciągu błędu (krok 1 powyżej).

    Na przykład ta zasada SOAPMessageValidation określa zmienną o nazwie request w elemencie <Source> zgodną z treś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 konkretnym procesie, w którym jest wykonywana zasada) lub
    • Nie można rozwiązać (nie określono)

    to jest jego przyczyna.

    Załóżmy, że powyższa zasada SOAPMessageValidation jest wykonywana w przepływie odpowiedzi. Jednak zmienna request użyta w przykładowym elemencie <Source> powyżej jest dostępna tylko w procesie żądania.

    Ponieważ w przepływie odpowiedzi nie ma zmiennej request, 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> nieudanej zasady SOAPMessageValidation jest zdefiniowana i istnieje w procesie, w którym jest wykonywana.

Aby poprawić przykład pokazany powyżej, możesz zmodyfikować element <Source> tak, aby używał zmiennej response, która istnieje w procesie 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 o błędzie

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

Przykładowa treść odpowiedzi dotyczącej błędu

{
  "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, response i message są typu Message. Więcej informacji o zmiennych dotyczących wiadomości znajdziesz w informacjach o zmiennych.

Diagnostyka

  1. Znajdź nazwę zmiennej, która nie jest rozpoznawana przez typ komunikatu z 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 konkretnym serwerze proxy interfejsu API, gdzie wystąpił błąd. Może istnieć co najmniej jedna zasada SOAPMessageValidation. Wskaż konkretne zasady 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 w elemencie <Source> 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>
    

    Ponieważ zmienna message.content nie jest typu komunikat, występuje błąd:

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

Rozdzielczość

Sprawdź, czy element <Source> w nieudanej zasadzie SOAPMessageValidation jest ustawiony na zmienną typu Message występującą w procesie, w którym jest wykonywana zasada.

Aby poprawić zasadę, możesz zmodyfikować element <Source>, aby określić zmienną typu Wiadomość. Na przykład w nieudanej zasadzie 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 o błędzie

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

Przykładowa treść odpowiedzi dotyczącej błędu

{
  "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 poprawności ładunku wejściowego wiadomości w odniesieniu do schematu XSD lub definicji WSDL. Zdarza się też, jeśli w wiadomości z ładunkiem występuje 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 Wejściowy ładunek SOAP jest niezgodny z definicją WSDL określoną w zasadzie 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ściowe ładunki XML nie są zgodne ze schematem XSD określonym 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. Wskaż nazwę zasady SOAPMessageValidation, przyczynę błędu i numer wiersza, w którym ładunek XML nie pasuje do schematu XSD. Wszystkie te informacje znajdują się w ciągu błędu. Na przykład w tym ciągu błędu nazwa zasady SOAPMessageValidation to SOAP-Message-Validation-1,przyczyna niepowodzenia 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 upewnij się, że do weryfikowania wiadomości korzysta ona z pliku definicji schematu XSD. Na przykład ta zasada SOAPMessageValidation zawiera plik zasobów XSD w elemencie <ResourceURL>:

    <?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 w wierszu o numerze określonym w kroku 1 powyżej, aby dowiedzieć się, co spowodowało błąd.

    Przykładowy ładunek wejściowego XML

    <?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 powyższym przykładzie 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żytym do walidacji element <shipTo> musi zawierać elementy podrzędne <name>, <street>, <address> i <country>. Wejściowy ładunek XML ma jednak tylko jeden 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 nakłada niepotrzebne ograniczenia, a w elemencie <shipTo> wymagany jest tylko element podrzędny <name>, możesz zmodyfikować Script-1.xsd w zasadzie SOAPMessageValidation. Aby sprawdzić przykładowy ładunek, 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, wejściowe ładunki XML mogą zostać zmienione na zgodne z xsd. Możesz na przykład zmodyfikować ładunek w taki sposób, 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, jeśli wejściowy ładunek SOAP nie jest zgodny z definicją WSDL określoną 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. Wskaż nazwę zasady SOAPMessageValidation, przyczynę błędu i numer wiersza, w którym ładunek SOAP nie jest zgodny z definicją WSDL. Wszystkie te informacje znajdziesz w ciągu znaków błędu. Na przykład w tym ciągu błędu nazwa zasady SOAPMessageValidation to SOAP-Message-Validation-1, przyczyną błędu jest \"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 używa ona schematu wsdl do weryfikowania wiadomości. Na przykład ta zasada SOAPMessageValidation zawiera plik zasobów wsdl w elemencie <ResourceURL>:

    <?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 w wierszu oznaczonym w kroku 1, aby dowiedzieć się, co spowodowało błąd.

    Przykładowe ładunki wejściowe 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 powyższym przykładzie 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, by zobaczyć, 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 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żyta definicja WSDL jest nieprawidłowa, możesz zmienić SOAP-Message-Validation-1.wsdl w zasadzie SOAPMessageValidation. Aby sprawdzić przykładowy ładunek, 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, wejściowe ładunki SOAP można zmienić tak, aby odpowiadały definicji WSDL.

Można na przykład zmodyfikować wejściowy ładunek SOAP w następujący 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, jeśli wejściowy ładunek SOAP nie jest zgodny z definicją WSDL określoną 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. Wskaż nazwę zasady SOAPMessageValidation, przyczynę błędu oraz numer wiersza ładunku XML, który nie jest zgodny z definicją WSDL. Wszystkie te informacje znajdziesz w ciągu błędu. Na przykład w tym ciągu znaków błędu nazwa zasady SOAPMessageValidation to SOAP-Message-Validation-1, przyczyna niepowodzenia 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 w wierszu o numerze określonym w kroku 1 powyżej, aby dowiedzieć się, co spowodowało błąd.

    Przykładowe ładunki wejściowe 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 pliku XML zawiera element <title>, ale nie jest zamknięty tagiem końcowym </title>.

Rozdzielczość

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

Można np. zmodyfikować wejściowe ładunki XML w następujący sposób:

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