分配消息政策部署错误问题排查

<ph type="x-smartling-placeholder"></ph> 您正在查看 Apigee Edge 文档。
转到 Apigee X 文档
信息

InvalidIndex

错误消息

通过 Edge 界面或 Edge Management API 部署 API 代理失败,并显示以下错误消息:

Error in deployment for environment [environment]
The revision is deployed, but traffic cannot flow.
AssignMessage[policy_name]: index must be greater than zero in [attribute].[index]

错误消息示例

Error in deployment for environment test.
The revision is deployed, but traffic cannot flow.
AssignMessage[GenerateStudentsRequest]: index must be greater than zero in id.0

示例屏幕截图

原因

如果“分配消息”政策的 <Copy> 和/或 <Remove> 元素中指定的索引为 0 或负数,则 API 代理的部署将失败。

例如,如果您传递多个同名的查询参数,则可以在 Edge 中将其作为已编入索引的流变量进行访问。假设您想将 3 名学生的 ID 作为查询参数进行传递,则可以按如下方式执行此操作:

https://myorg-test.apigee.net/v1/basepath?school_name=NPS&id=1&id=2&id=3

然后,假设您尝试按如下方式通过“分配消息”政策中的索引编号 0、1 和 2 访问这些查询参数:

id.0
id.1 and
id.2

在这种情况下,代理的部署将失败,因为索引必须以 1 开头。这意味着,您可以将第一个查询参数“id=1”作为“id.1”进行访问。如需访问第二个查询参数“id=2”,您需要使用索引 2,即“id.2”。同样,如需访问第三个查询参数“id=3”,您可以使用“id.3”。

您可以在此了解详细信息。

诊断

  1. 标识发生错误的“分配消息”政策、属性名称和无效的索引。您可以在错误消息中找到这些项。例如,在以下错误中,政策名称为 GeneratingGeocodingRequest,属性名称为 id,索引为 0

    AssignMessage[GenerateStudentsRequest]: index must be greater than zero in id.0
    
  2. 验证失败的“分配消息”政策 XML 中使用的属性名称和索引是否与错误消息中标识的属性名称和索引匹配(上述第 1 步)。例如,以下政策将属性 id 和索引指定为 0,它与错误消息中的内容匹配:

    <AssignMessage name="GenerateStudentsRequest">
      <AssignTo createNew="true" type="request">StudentsInfoRequest</AssignTo>
      <Copy source="request">
          <QueryParams>
              <QueryParam name="school_name"/>
              <QueryParam name="id.0"/>
              <QueryParam name="id.1"/>
              <QueryParam name="id.2"/>
          </QueryParams>
      </Copy>
    </AssignMessage>
    
  3. 如果指定的索引为 0 或负数,则会导致错误。

    在上面显示的“分配消息”政策示例中,您正在尝试使用索引 0 访问查询参数“id”的第一个值。因此,API 代理的部署失败并显示以下错误:

    AssignMessage[GenerateStudentsRequest]: index must be greater than zero in id.0
    

解决方法

在“分配消息”中,如果您访问多个标题、查询参数或其他同名的参数,请确保索引始终大于零。例如:

<AssignMessage name="GenerateStudentsRequest">
    <AssignTo createNew="true" type="request">StudentsInfoRequest</AssignTo>
    <Copy source="request">
        <QueryParams>
            <QueryParam name="school_name"/>
            <QueryParam name="id.1"/>
            <QueryParam name="id.2"/>
            <QueryParam name="id.3"/>
        </QueryParams>
    </Copy>
</AssignMessage>

InvalidVariableName

错误消息

通过 Edge 界面或 Edge Management API 部署 API 代理失败,并显示以下错误消息:

Error Saving Revision [revision_number]
The revision is deployed, but traffic cannot flow. AssignMessage schema validation failed: invalid variable name - null - in assign variable.

错误消息示例

Error Saving Revision 3
AssignMessage schema validation failed: invalid variable name - null - in assign variable.

示例屏幕截图

原因

如果子元素 <Name> 为空或未在 <AssignVariable> 元素中指定,则 API 代理的部署将失败,因为没有向其分配值的有效变量名称。必须提供有效的变量名称。

诊断

检查失败的特定 API 代理中的所有“分配消息”政策。如果存在子元素 <Name> 为空或未在 <AssignVariable> 元素中指定的任何“分配消息”政策,则会导致错误。

示例 1:以下“分配消息”政策未定义 <Name> 元素。

<AssignMessage async="false" continueOnError="false" enabled="true" name="Assign-Message-1">
    <DisplayName>Assign Message-1</DisplayName>
    <Properties/>
    <AssignVariable>
        <Value>abcd1234</Value>
    </AssignVariable>
    <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
    <AssignTo createNew="true" transport="http" type="request">googleBookReq</AssignTo>
</AssignMessage>

示例 2:以下“分配消息”政策包含空 <Name> 元素。

<AssignMessage async="false" continueOnError="false" enabled="true" name="Assign-Message-1">
    <DisplayName>Assign Message-1</DisplayName>
    <Properties/>
    <AssignVariable>
        <Name></Name>
        <Value>abcd1234</Value>
    </AssignVariable>
    <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
    <AssignTo createNew="true" transport="http" type="request">googleBookReq</AssignTo>
</AssignMessage>

解决方法

确保始终在“分配消息”政策的 <AssignVariable> 元素中指定子元素 <Name> 且非空。例如:

<AssignMessage async="false" continueOnError="false" enabled="true" name="Assign-Message-1">
    <DisplayName>Assign Message-1</DisplayName>
    <Properties/>
        <AssignVariable>
        <Name>appSecret</Name>
        <Value>abcd1234</Value>
    </AssignVariable>
    <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
    <AssignTo createNew="true" transport="http" type="request">googleBookReq</AssignTo>
</AssignMessage>