Khắc phục sự cố thời gian chạy của chính sách Xác thực thông báo SOAP

Bạn đang xem tài liệu về Apigee Edge.
Chuyển đến Tài liệu về Apigee X.
thông tin

SourceMessageNotAvailable

Mã lỗi

steps.messagevalidation.SourceMessageNotAvailable

Nội dung phản hồi về lỗi

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

Ví dụ về nội dung phản hồi "Lỗi"

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

Nguyên nhân

Lỗi này xảy ra nếu biến message được chỉ định trong phần tử <Source> của chính sách SOAPMessageValidation:

  • Nằm ngoài phạm vi áp dụng (không áp dụng trong quy trình cụ thể mà chính sách đang được thực thi) hoặc
  • không thể giải quyết (không xác định)

Ví dụ: lỗi này xảy ra nếu phần tử <Source> trong chính sách SOAPMessageValidation được đặt thành một biến không tồn tại trong quy trình thực thi chính sách này.

Chẩn đoán

  1. Xác định tên chính sách SOAPMessageValidation nơi lỗi xảy ra và tên của biến source trong chuỗi lỗi. Ví dụ: trong chuỗi lỗi sau, tên chính sách SOAPMessageValidation là SOAP-Message-Validation-1 và biến sourcerequest:

    "faultstring": "request message is not available for MessageValidation: SOAP-Message-Validation-1"
    
  2. Trong tệp XML của chính sách SOAPMessageValidation (Xác thực SOAPMessageValidation) bị lỗi, hãy xác minh rằng tên của biến được đặt trong phần tử <Source> khớp với tên biến được xác định trong chuỗi lỗi (Bước 1 ở trên).

    Ví dụ: chính sách SOAPMessageValidation sau đây chỉ định một biến có tên request trong phần tử <Source> khớp với nội dung trong chuỗi lỗi:

    <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. Xác định xem biến được dùng trong phần tử <Source> đã được xác định và có sẵn trong quy trình thực thi chính sách SOAPMessageValidation hay không.

    Nếu biến là:

    • nằm ngoài phạm vi (không có trong luồng cụ thể mà chính sách đang được thực thi) hoặc
    • không thể phân giải (chưa được xác định)

    thì đó là nguyên nhân gây ra lỗi.

    Ví dụ: giả sử chính sách SOAPMessageValidation được trình bày ở trên thực thi trong quy trình phản hồi. Tuy nhiên, biến request được dùng trong ví dụ về phần tử <Source> ở trên chỉ có trong quy trình yêu cầu.

    Vì biến request không tồn tại trong luồng phản hồi, nên bạn sẽ gặp lỗi sau:

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

Độ phân giải

Đảm bảo rằng biến được đặt trong phần tử <Source> của chính sách SOAPMessageValidation (Xác thực SOAPMessageValidation) không thành công được xác định và tồn tại trong quy trình thực thi chính sách này.

Để sửa ví dụ ở trên, bạn có thể sửa đổi phần tử <Source> để sử dụng biến response có trong luồng phản hồi:

<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

Mã lỗi

steps.messagevalidation.NonMessageVariable

Nội dung phản hồi về lỗi

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

Ví dụ về nội dung phản hồi "Lỗi"

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

Nguyên nhân

Lỗi này xảy ra nếu phần tử <Source> trong chính sách SOAPMessageValidation được đặt thành một biến không thuộc loại Message.

Biến loại thông báo đại diện cho toàn bộ yêu cầu và phản hồi HTTP. Các biến flow tích hợp sẵn trong Apigee Edge request, responsemessage đều thuộc loại Thông báo. Để tìm hiểu thêm về biến thông báo, hãy xem phần Tài liệu tham khảo về biến.

Chẩn đoán

  1. Xác định tên của biến không phân giải thành loại Thông báo từ chuỗi lỗi. Ví dụ: trong chuỗi lỗi sau, tên của biến là message.content:

    "faultstring": "Variable message.content does not resolve to a Message"
    
  2. Kiểm tra tất cả các chính sách SOAPMessageValidation trong Proxy API cụ thể nơi xảy ra lỗi. Có thể có một hoặc nhiều chính sách SOAPMessageValidation. Xác định chính sách hoặc các chính sách SOAPMessageValidation cụ thể, trong đó biến được chỉ định trong phần tử <Source> khớp với tên biến được xác định trong chuỗi lỗi (Bước 1 ở trên).

    Ví dụ: chính sách sau đây đặt phần tử <Source> thành biến có tên message.content, khớp với nội dung trong chuỗi lỗi:

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

    Vì biến message.content không thuộc loại Thông báo nên bạn gặp lỗi:

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

Độ phân giải

Đảm bảo rằng phần tử <Source> trong chính sách SOAPMessageValidation (Xác thực SOAPMessageValidation) không thành công được đặt thành biến loại Message (Tin nhắn) tồn tại trong quy trình thực thi chính sách này.

Để sửa chính sách, bạn có thể sửa đổi phần tử <Source> để chỉ định một biến thuộc loại Message (Thông báo). Ví dụ: trong chính sách SOAPMessageValidation (Xác thực SOAPMessageValidation) không thành công, bạn có thể chỉ định phần tử <Source>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>

Không thành công

Mã lỗi

steps.messagevalidation.Failed

Nội dung phản hồi về lỗi

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

Ví dụ về nội dung phản hồi "Lỗi"

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

Nguyên nhân

Lỗi này xảy ra nếu chính sách SOAPMessageValidation (Xác thực SOAPMessageValidation) không xác thực được tải trọng thông báo đầu vào dựa trên giản đồ XSD hoặc định nghĩa WSDL. Lỗi này cũng sẽ xảy ra nếu thông báo về tải trọng có JSON hoặc XML không đúng định dạng.

Dưới đây là một số nguyên nhân có thể gây ra lỗi này:

Nguyên nhân Mô tả
Tải trọng XML không khớp Trọng tải XML đầu vào không tuân thủ lược đồ XSD được chỉ định trong chính sách SoapMessageValidation.
Trọng tải SOAP không khớp Tải trọng SOAP đầu vào không tuân thủ định nghĩa WSDL được chỉ định trong chính sách SoapMessageValidation.
XML hoặc XML không đúng định dạng Tải trọng SOAP đầu vào không chứa JSON hoặc XML có định dạng hợp lệ.

Nguyên nhân: Tải trọng XML không khớp

Lỗi này xảy ra nếu tải trọng XML đầu vào không tuân thủ giản đồ XSD được chỉ định trong phần tử <ResourceURL> của chính sách SoapMessageValidation.

Ví dụ về thông báo lỗi

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

Chẩn đoán

  1. Xác định tên chính sách SOAPMessageValidation, lý do xảy ra lỗi và số dòng mà tải trọng XML không khớp với giản đồ XSD. Tất cả thông tin này đều nằm trong chuỗi lỗi. Ví dụ: trong chuỗi lỗi sau, tên chính sách SOAPMessageValidation là SOAP-Message-Validation-1,nguyên nhân gây ra lỗi là Expecting a child element but found none [Line 9]: và số dòng là 9.

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expecting a child element but found none [Line 9]\""
    
  2. Kiểm tra chính sách SOAPMessageValidation và xác nhận rằng chính sách này sử dụng tệp định nghĩa giản đồ XSD để xác thực thông báo. Ví dụ: chính sách SOAPMessageValidation sau đây có một tệp tài nguyên XSD trong phần tử <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. Kiểm tra tải trọng đầu vào theo số dòng đã xác định trong Bước 1 ở trên để tìm hiểu nguyên nhân gây ra lỗi.

    Tải trọng XML đầu vào mẫu

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

    Trong ví dụ minh hoạ ở trên, dòng 9 có thẻ đóng </shipTo>.

  4. Kiểm tra tệp định nghĩa giản đồ XML, Script-1.xsd, được dùng trong chính sách SOAPMessageValidation để xem phần tử <shipTo> sẽ có dạng như thế nào:

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

    Theo XSD mẫu được dùng để xác thực, phần tử <shipTo> phải có các phần tử con <name>, <street>, <address><country>. Tuy nhiên, tải trọng XML đầu vào chỉ có một phần tử con là <name>. Do đó, bạn sẽ gặp lỗi:

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

Độ phân giải

Có 2 cách để giải quyết lỗi xác thực này:

Giải pháp 1

Nếu bạn xác định rằng định nghĩa giản đồ XSD áp đặt các giới hạn không cần thiết và chỉ có phần tử con <name> là bắt buộc trong phần tử <shipTo>, thì bạn có thể sửa đổi Script-1.xsd dùng trong chính sách SOAPMessageValidation. Để xác thực ví dụ về tải trọng ở trên, bạn có thể sửa đổi tệp XSD như sau:

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

Giải pháp 2

Nếu tệp định nghĩa XSD là chính xác, thì bạn có thể thay đổi tải trọng XML đầu vào để khớp với xsd. Ví dụ: bạn có thể sửa đổi tải trọng để tuân thủ xsd như sau:

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

Nguyên nhân: tải trọng SOAP không khớp

Lỗi này xảy ra nếu tải trọng SOAP đầu vào không tuân thủ định nghĩa WSDL được chỉ định trong phần tử <ResourceURL> của chính sách SoapMessageValidation.

Ví dụ về thông báo lỗi

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

Chẩn đoán

  1. Xác định tên chính sách SOAPMessageValidation, lý do không thực hiện được và số dòng mà phần tải dữ liệu SOAP không khớp với định nghĩa WSDL. Bạn có thể tìm thấy tất cả thông tin này trong chuỗi lỗi. Ví dụ: trong chuỗi lỗi sau, tên chính sách SOAPMessageValidation là SOAP-Message-Validation-1, nguyên nhân gây ra lỗi là \"Element name mismatch. Wildcard? [Line 11]\"" và số dòng là 11:

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Element name mismatch. Wildcard? [Line 11]\""
    
  2. Kiểm tra chính sách SOAPMessageValidation và xác nhận rằng chính sách này sử dụng giản đồ wsdl để xác thực thông báo. Ví dụ: chính sách SOAPMessageValidation sau đây có một tệp tài nguyên wsdl trong phần tử <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. Kiểm tra tải trọng đầu vào theo số dòng đã xác định trong Bước 1 để tìm hiểu nguyên nhân gây ra lỗi.

    Tải trọng SOAP đầu vào mẫu

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

    Trong ví dụ minh hoạ ở trên, dòng 11 có phần tử con <country> trong phần tử <shipTo>.

  4. Kiểm tra tệp Định nghĩa WSDL, SOAP-Message-Validation-1.wsdl, được dùng trong chính sách SOAPMessageValidation để xem có gì không ổn với phần tử con <country> trong phần tử <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>
    ...
    

    Theo định nghĩa WSDL dùng để xác thực, phần tử <shipTo> không có phần tử con <country>. Do đó, bạn sẽ gặp lỗi:

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

Độ phân giải

Có 2 cách để giải quyết lỗi xác thực này:

Giải pháp 1

Nếu xác định rằng định nghĩa WSDL được sử dụng là không chính xác, bạn có thể thay đổi SOAP-Message-Validation-1.wsdl dùng trong chính sách SOAPMessageValidation. Để xác thực ví dụ về tải trọng ở trên, bạn có thể sửa đổi tệp như sau:

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

Giải pháp 2

Nếu định nghĩa WSDL là chính xác, thì tải trọng SOAP đầu vào có thể được thay đổi để khớp với định nghĩa WSDL.

Ví dụ: Bạn có thể sửa đổi tải trọng SOAP đầu vào như sau:

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

Nguyên nhân: JSON hoặc XML không đúng định dạng

Lỗi này xảy ra nếu tải trọng SOAP đầu vào không tuân thủ định nghĩa WSDL được chỉ định trong phần tử <ResourceURL> của chính sách SoapMessageValidation.

Ví dụ về thông báo lỗi

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

Chẩn đoán

  1. Xác định tên chính sách SOAPMessageValidation, lý do không thực hiện được và số dòng của tải trọng XML không khớp với định nghĩa WSDL. Bạn có thể tìm thấy tất cả thông tin này trong chuỗi về lỗi. Ví dụ: trong chuỗi lỗi sau, tên chính sách SOAPMessageValidation là SOAP-Message-Validation-1, lý do lỗi là Expected </title> at line 15(possibly around char 420): và số dòng là15.

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expected </title> at line 15(possibly  around char 420)\""
    
  2. Kiểm tra tải trọng đầu vào theo số dòng đã xác định trong Bước 1 ở trên để tìm hiểu nguyên nhân gây ra lỗi.

    Tải trọng SOAP đầu vào mẫu

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

    Trong ví dụ nêu trên, dòng 15 của XML đầu vào có phần tử <title> nhưng không đóng bằng thẻ đóng </title>.

Độ phân giải

Để khắc phục lỗi này, hãy đảm bảo rằng tải trọng đầu vào là hợp lệ và được tạo đúng cách.

Ví dụ: Bạn có thể sửa đổi tải trọng XML đầu vào như sau:

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