SOAP Mesaj Doğrulama politikası çalışma zamanı hatası sorunlarını giderme

Apigee Edge belgelerini görüntülüyorsunuz.
Apigee X belgelerine gidin.
info

SourceMessageNotAvailable

Hata Kodu

steps.messagevalidation.SourceMessageNotAvailable

Hata yanıtı gövdesi

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

Örnek Hata yanıtı gövdesi

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

Neden

Bu hata, SOAPMessageValidation politikasının <Source> öğesinde belirtilen message değişkeni aşağıdakilerden biriyse oluşur:

  • Kapsam dışında (politikanın yürütüldüğü belirli akışta kullanılamaz) veya
  • çözülemiyor (tanımlanmamış)

Örneğin, bu hata SOAPMessageValidation politikasındaki <Source> öğesi, politikanın yürütüldüğü akışta bulunmayan bir değişkene ayarlanırsa meydana gelir.

Teşhis

  1. Hatanın oluştuğu SOAPMessageValidation politika adını ve hata dizesindeki source değişkeninin adını belirleyin. Örneğin, aşağıdaki hata dizesinde SOAPMessageValidation politikasının adı SOAP-Message-Validation-1, source değişkeni ise request'dir:

    "faultstring": "request message is not available for MessageValidation: SOAP-Message-Validation-1"
    
  2. Başarısız SOAPMessageValidation politikası XML'inde, <Source> öğesinde ayarlanan değişken adının, hata dizesinde tanımlanan değişken adıyla eşleştiğini doğrulayın (yukarıdaki 1. adım).

    Örneğin, aşağıdaki SOAPMessageValidation politikası, <Source> öğesinde, hata dizesindeki değerle eşleşen, request adlı bir değişkeni belirtir:

    <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. <Source> öğesinde kullanılan değişkenin tanımlı olup olmadığını ve SOAPMessageValidation politikasının yürütüldüğü akışta kullanılabilir olup olmadığını belirleyin.

    Değişken şunlardan biriyse:

    • Kapsam dışında (politikanın yürütüldüğü belirli akışta kullanılamaz) veya
    • çözülemiyor (tanımlanmamış)

    hatanın nedeni budur.

    Örnek olarak, yukarıda gösterilen SOAPMessageValidation politikasının yanıt akışında yürütüldüğünü varsayalım. Ancak yukarıdaki <Source> öğesi örneğinde kullanılan request değişkeni yalnızca istek akışında kullanılabilir.

    Yanıt akışında request değişkeni bulunmadığından şu hatayı alırsınız:

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

Çözünürlük

Başarısız SOAPMessageValidation politikasının <Source> öğesinde ayarlanan değişkenin tanımlandığından ve politikanın yürütüldüğü akışta bulunduğundan emin olun.

Yukarıda gösterilen örneği düzeltmek için <Source> kullanılacak öğe yanıt akışında bulunan response değişkeni

<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

Hata Kodu

steps.messagevalidation.NonMessageVariable

Hata yanıtı gövdesi

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

Örnek Hata yanıtı gövdesi

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

Neden

Bu hata, SOAPMessageValidation politikasındaki <Source> öğesi Message türüne ait olmayan bir değişkene ayarlanırsa ortaya çıkar.

Mesaj türü değişkenleri, HTTP isteklerinin ve yanıtlarının tamamını temsil eder. Yerleşik Apigee Edge akış değişkenleri request, response ve message Message türündedir. Mesaj değişkenleri hakkında daha fazla bilgi edinmek için Değişkenler referansı başlıklı makaleyi inceleyin.

Teşhis

  1. Hata dizesinden bir Mesaj türüne çözümlenmeyen değişkenin adını belirleyin. Örneğin, aşağıdaki hata dizesinde değişkenin adı message.content şeklindedir:

    "faultstring": "Variable message.content does not resolve to a Message"
    
  2. Hatanın oluştuğu API proxy'sindeki tüm SOAPMessageValidation politikalarını inceleyin. Bir veya daha fazla SOAPMessageValidation politikası olabilir. <Source> öğesinde belirtilen değişkenin, hata dizesinde tanımlanan değişken adıyla eşleştiği özel SOAPMessageValidation politikasını veya politikalarını tanımlayın (yukarıdaki 1. adım).

    Örneğin, aşağıdaki politika <Source> öğesini message.content adlı bir değişkene ayarlar. Bu değişken, hata dizesindekiyle eşleşir:

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

    message.content değişkeni Message türü olmadığından şu hatayı alırsınız:

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

Çözünürlük

Başarısız SOAPMessageValidation politikasındaki <Source> öğesinin, politikanın yürütüldüğü akışta bulunan bir Message türü değişkene ayarlandığından emin olun.

Politikayı düzeltmek için <Source> öğesini Message (İleti) türünde bir değişken belirtecek şekilde değiştirebilirsiniz. Örneğin, başarısız olan SOAPMessageValidation politikasında, <Source> öğesini request olarak belirtebilirsiniz:

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

Başarısız

Hata Kodu

steps.messagevalidation.Failed

Hata yanıtı gövdesi

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

Örnek Hata yanıtı gövdesi

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

Neden

Bu hata, SOAPMessageValidation politikası, giriş mesajı yükünü XSD şemasına veya WSDL tanımına göre doğrulayamazsa meydana gelir. Yük mesajında hatalı biçimlendirilmiş JSON veya XML varsa da bu hata oluşur.

Bu hataya yol açabilecek bazı olası nedenler şunlardır:

Neden Açıklama
Eşleşmeyen XML yükü Giriş XML yükü, SoapMessageValidation politikasında belirtilen XSD şemasına uymuyor.
SOAP yükü uyuşmazlığı Giriş SOAP yükü, SoapMessageValidation politikasında belirtilen WSDL tanımına uymuyor.
Yanlış biçimlendirilmiş JSON veya XML Giriş SOAP yükü iyi biçimlendirilmiş XML veya JSON içermiyor.

Neden: Eşleşmeyen XML yükü

Bu hata, giriş XML yükü XSD şemasına uygun olmazsa ortaya çıkar SoapMessageValidation politikasının <ResourceURL> öğesinde belirtilmiş.

Örnek Hata Mesajı

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

Teşhis

  1. SOAPMessageValidation politikasının adını, hatanın nedenini ve XML yükünün XSD şemasıyla eşleşmediği satır numarasını tanımlayın. Bu bilgilerin tamamı hata dizesinde bulunur. Örneğin, aşağıdaki hata dizesinde SOAPMessageValidation politikasının adı: SOAP-Message-Validation-1,hatanın nedeni Expecting a child element but found none [Line 9], satır numarası ise 9.

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expecting a child element but found none [Line 9]\""
    
  2. SOAPMessageValidation politikasını inceleyin ve mesajları doğrulamak için bir XSD şema tanım dosyası kullandığını onaylayın. Örneğin, aşağıdaki SOAPMessageValidation politikasının <ResourceURL> öğesinde bir XSD kaynak dosyası var:

    <?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. Hatanın nedenini anlamak için yukarıdaki 1. adımda belirtilen satır numarasındaki giriş yükünü inceleyin.

    Örnek giriş XML yükü

    <?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>
    

    Yukarıda gösterilen örnekte 9. satırda </shipTo> bitiş etiketi vardır.

  4. <shipTo> öğesinin nasıl görünmesi gerektiğini görmek için SOAPMessageValidation politikasında kullanılan XML şeması tanımı dosyasını (Script-1.xsd) inceleyin:

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

    Doğrulama için kullanılan örnek XSD'ye göre <shipTo> öğesi <name>, <street>, <address> ve <country> alt öğelerini içerir. Ancak giriş XML yükünde yalnızca bir alt öğe (<name>) vardır. Bu nedenle, şu hatayı alırsınız:

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

Çözünürlük

Bu doğrulama hatasını çözmenin iki yolu vardır:

1. Çözüm

XSD şeması tanımının gereksiz sınırlamalar getirdiğini ve <shipTo> öğesi altında yalnızca <name> alt öğesinin gerekli olduğunu belirlerseniz SOAPMessageValidation politikasında kullanılan Script-1.xsd öğesini değiştirebilirsiniz. Yukarıdaki yük örneğini doğrulamak için XSD dosyasını aşağıdaki şekilde değiştirebilirsiniz:

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

2. Çözüm

XSD tanım dosyası doğruysa giriş XML yükü, xsd ile eşleşecek şekilde değiştirilebilir. Örneğin, yükün xsd'ye uygun olması için aşağıdaki gibi değiştirebilirsiniz:

<?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>

Neden: SOAP yükü uyuşmazlığı

Bu hata, giriş SOAP yükü SoapMessageValidation politikasının <ResourceURL> öğesinde belirtilen WSDL tanımına uymadığında ortaya çıkar.

Örnek Hata Mesajı

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

Teşhis

  1. SOAPMessageValidation politikasının adını, hatanın nedenini ve SOAP yükünün WSDL tanımıyla eşleşmediği satır numarasını tanımlayın. Tüm bu bilgileri hata dizesinde bulabilirsiniz. Örneğin, aşağıdaki hata dizesinde SOAPMessageValidation politikasının adı SOAP-Message-Validation-1, hatanın nedeni \"Element name mismatch. Wildcard? [Line 11]\"" ve satır numarası 11:

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Element name mismatch. Wildcard? [Line 11]\""
    
  2. SOAPMessageValidation politikasını inceleyin ve mesajları doğrulamak için bir wsdl şeması kullandığından emin olun. Örneğin, aşağıdaki SOAPMessageValidation politikasının <ResourceURL> öğesinde bir wsdl kaynak dosyası var:

    <?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. Hatanın nedenini anlamak için 1. adımda tanımlanan satır numarasındaki giriş yükünü inceleyin.

    Örnek Giriş SOAP Yükü

    <?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>
    

    Yukarıdaki örnekte, 11. satırda <shipTo> öğesinin altında <country> alt öğesi bulunmaktadır.

  4. <shipTo> öğesinin altındaki <country> alt öğesinde neyin yanlış olabileceğini görmek için SOAPMessageValidation politikasında kullanılan WSDL Tanım dosyasını (SOAP-Message-Validation-1.wsdl) inceleyin:

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

    Doğrulama için kullanılan WSDL tanımına göre <shipTo> öğesinin bir <country> alt öğesi yok. Sonuç olarak şu hatayı alırsınız:

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

Çözünürlük

Bu doğrulama hatasını çözmenin iki yolu vardır:

1. Çözüm

Kullanılan WSDL tanımının yanlış olduğunu tespit ederseniz SOAPMessageValidation politikasında kullanılan SOAP-Message-Validation-1.wsdl değerini değiştirebilirsiniz. Yukarıdaki yük örneğini doğrulamak için dosyayı aşağıdaki şekilde değiştirebilirsiniz:

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

2. Çözüm

WSDL tanımı doğruysa giriş SOAP yükü WSDL tanımıyla eşleşecek şekilde değiştirilebilir.

Örneğin, giriş SOAP yükünü aşağıdaki gibi değiştirebilirsiniz:

<?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>

Neden: Yanlış biçimlendirilmiş JSON veya XML

Bu hata, giriş SOAP yükü SoapMessageValidation politikasının <ResourceURL> öğesinde belirtilen WSDL tanımına uymadığında ortaya çıkar.

Örnek Hata Mesajı

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

Teşhis

  1. SOAPMessageValidation politikasının adını, hatanın nedenini ve WSDL tanımıyla eşleşmeyen XML yükünün satır numarasını tanımlayın. Tüm bu bilgileri hata dizesinde bulabilirsiniz. Örneğin, aşağıdaki hata dizesinde SOAPMessageValidation politikasının adı SOAP-Message-Validation-1, hatanın nedeni Expected </title> at line 15(possibly around char 420):, satır numarası ise 15. şeklindedir.

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expected </title> at line 15(possibly  around char 420)\""
    
  2. Hatanın nedenini anlamak için yukarıdaki 1. adımda tanımlanan satır numarasındaki giriş yükünü inceleyin.

    Örnek Giriş SOAP Yükü

    <?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>
    

    Yukarıda gösterilen örnekte, giriş XML'inin 15. satırında <title> öğesi vardır ancak </title> bitiş etiketiyle kapatılmamıştır.

Çözünürlük

Hatayı çözmek için giriş yükünün geçerli olduğundan ve doğru biçimlendirildiğinden emin olun.

Örneğin, giriş XML yükünü aşağıdaki gibi değiştirebilirsiniz:

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