排查 SAP 适配器的操作问题

本部分讨论如何使用故障排除技术解决在 mySAP Business Suite 中使用 Microsoft BizTalk 适配器时可能会遇到的作错误。

启用跟踪

有关 SAP 适配器中的跟踪支持的信息,请参阅 SAP 适配器的诊断跟踪和消息日志记录

加载绑定时出错

问题

尝试启动“添加适配器服务引用 Visual Studio 插件”或“使用适配器服务 BizTalk 项目外接程序”时,GUI 界面显示以下错误提示:

There was an error loading the binding, <binding name>, from your system configuration.
ConfigurationErrorsException: Exception has been thrown by the target of an invocation.

原因

启动“添加适配器服务引用插件”或“使用适配器服务加载项”时,Windows Communication Foundation (WCF) 会加载所有已安装适配器的适配器绑定。 反过来,适配器绑定依赖于企业应用程序的特定客户端软件。 由于以下一个或两个原因,可能会遇到此问题:

  • 未在安装了适配器的计算机上安装所需的 LOB 客户端软件。

  • 你执行了适配器的典型安装或完整安装,该适配器安装 BizTalk 适配器包中包含的所有适配器。 但是,只能为一个企业应用程序安装 LOB 客户端库。 因此,GUI 无法加载其他适配器的绑定。

    解决方案

  • 请确保执行适配器的自定义安装,以便仅安装所需的适配器。

  • 请确保在安装了 BizTalk 适配器包的计算机上安装所需的 LOB 客户端版本。 支持的 LOB 系统 列出了受支持的版本。 BizTalk 适配器包还需要某些 DLL 才能与 SAP 系统进行交互。 有关适配器所需的 DLL 的详细信息,请参阅 安装适用于 SAP 的数据提供程序的自定义 RFC

BizTalk 管理控制台中缺少 SAP 适配器

问题

BizTalk 适配器包附带的 SAP 适配器不会显示在 BizTalk Server 管理控制台中的适配器列表中。

原因

SAP 适配器是 WCF 自定义绑定。 因此,尽管 BizTalk Server 管理控制台显示 WCF-Custom 适配器,但它不显示 WCF 自定义绑定,因此不会显示基于 WCF 的 SAP 适配器。

解决方案

可以按照将 SAP 适配器添加到 BizTalk Server 管理控制台中所述的步骤,将 SAP 适配器显式添加到 BizTalk Server 管理控制台。

缺少 DLL 错误在打开与 SAP 的连接时发生

问题

尝试使用 SAP 适配器打开与 SAP 系统的连接时,SAP 系统中会显示一个对话框,告知缺少某些 DLL。

原因

SAP 适配器使用 librfc32u.dll 与 SAP 系统建立连接。 反过来,librfc32u.dll需要一组 DLL 才能正常运行。 如果未将这些支持 DLL 添加到安装 SAP 适配器的计算机上的 PATH 变量,则会出现此错误。

解决方案

请参阅所提供的表格,该表格用于解决加载适配器绑定时出错的问题。 下表列出了使用 SAP 适配器与 SAP 系统接口所需的支持 DLL。

检索超过 65,536 个节点的 XML 时出错

问题

适配器在检索超过 65,536 个节点的 XML 输出时提供以下错误。

Maximum number of items that can be serialized or deserialized in an object graph is '65536'.
Change the object graph or increase the MaxItemsInObjectGraph quota.

原因

适配器无法序列化和反序列化包含 65,536 个以上的项的对象。

解决方案

可以通过以下两种方式之一设置 maxItemsInObjectGraph 参数来解决此问题:

  • 通过在服务类的属性ServiceBehavior中更改maxItemsInObjectGraph参数来设置此参数。

  • 将以下内容添加到应用程序的 app.config 文件中。

    <behaviors>
      <endpointBehaviors>
        <behavior name="NewBehavior">
          <dataContractSerializer maxItemsInObjectGraph="65536000" />
        </behavior>
      </endpointBehaviors>
    </behaviors>
    

    示例 app.config 如下所示。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.serviceModel>
    <behaviors>
      <endpointBehaviors>
        <behavior name="NewBehavior">
         <dataContractSerializer maxItemsInObjectGraph="65536000" />
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <client>
      <endpoint   behaviorConfiguration="NewBehavior" binding="sapBinding"
       contract="IOutboundContract" name="sap_ICalculator" />
    </client>
  </system.serviceModel>
</configuration>

在 BizTalk Server 中输入 WCF-Custom 端口的连接 URI 时出错

问题

当指定连接到 SAP 系统的连接 URI 时,BizTalk Server 会提供以下错误。

Error saving properties.
(System.ArgumentException) The specified address is invalid.
(System.ArgumentException) Invalid address;
"<connection URI>" is not a well-formed absolute uri.

原因

连接 URI 不符合标准编码格式。 例如,参数的值可能包含空格。

解决方案

请确保指定的连接 URI 符合标准编码格式。 例如,空格必须替换为“%20”。

在 SAP 上完成操作时出现 System.ArgumentNullException 错误

问题

使用 BizTalk Server 对 SAP 系统执行任何操作时,适配器会显示以下错误信息。

System.ArgumentNullException: Value cannot be null.

原因

未指定消息的 WCF 操作。 WCF 要求为每个操作指定一个 SOAP 操作,该操作通知适配器要对 LOB 系统执行的操作。

解决方案

在发送端口中指定 SOAP 操作,或在 BizTalk 流程中将其作为消息上下文属性。 有关说明,请参阅 配置 SAP 系统的 SOAP 操作。 请参阅 消息和消息架构,查看每个操作的动作列表。

由于指定操作中的操作名称不正确,XmlReaderParsingException。

问题

BizTalk Server 管理控制台向 SAP 系统发送消息时出现以下错误:

Microsoft.ServiceModel.Channels.Common.XmlReaderParsingException: Invalid argument:
<BtsActionMapping xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Operation Name="<operation_name>" Action="<action>" />
</BtsActionMapping>

原因

如果通过导入适配器服务 BizTalk 项目插件创建的端口绑定文件来配置 WCF-Custom 端口,则端口中的动作使用以下格式指定:

<BtsActionMapping>
  <Operation Name="Op1" Action="http://MyService/Svc/Op1" />
</BtsActionMapping>

在上述格式中,操作名称由你在生成模式时选择的操作控制。 例如,如果为RFC_CUSTOMER_GET生成架构,则在操作中的名称将为“RFC_CUSTOMER_GET”。 但是,在 Visual Studio 的 BizTalk 业务流程中创建的逻辑端口中的操作名称可能会有所不同。

解决方案

确保逻辑端口(在 Visual Studio 中的 BizTalk 业务流程)和物理端口(在 BizTalk Server 管理控制台中)的操作名称相同。

打开到 SAP 的连接数超过 100 个时发生错误

问题

当打开到 SAP 系统的 100 多个连接时,适配器将引发以下异常。

Microsoft.ServiceModel.Channels.Common.ConnectionException: ErrorCode=RFC_OK. ErrorGroup=RFC_ERROR_COMMUNICATION. SapErrorMessage=Connect to SAP gateway failed
Connect_PM  GWHOST=<gw_host>, GWSERV=<gw_serv>, SYSNR=<sys_number>
LOCATION    CPIC (TCP/IP) on local host with Unicode
ERROR       max no of 100 conversations exceeded

原因

默认情况下,SAP 不会在系统中启用超过 100 个连接。

解决方案

若要增加最大连接数,必须在安装了 SAP 客户端库的计算机上创建环境变量,并将其设置为数值。 为此环境变量指定的值是可以连接到 SAP 系统的最大连接数。 使用以下详细信息创建环境变量:

  • 变量名称:CPIC_MAX_CONV

  • 变量值:任何正数值。 例如,若要启用到 SAP 系统的 200 个连接,请将该值指定为 200。

    有关环境变量的详细信息,请转到 Windows PowerShell:about_Environment_Variables

生成或检索 IDOC 的元数据时出错

问题

在 SAP 系统中为 IDOC 的 接收 操作生成元数据时,SAP 适配器会出现以下错误消息。

Error while retrieving or generating the WSDL.
Adapter message: Details: ErrorCode=RFC_EXCEPTION.
ErrorGroup=RFC_ERROR_APPLICATION_EXCEPTION. SapErrorMessage= OBJECT_UNKNOWN.
AdapterErrorMessage=Error returned by RfcCallReceiveEx while calling RFC: IDOCTYPE_READ_COMPLETE.

原因

SAP 适配器使用 IDOCTYPE_READ_COMPLETE RFC 检索 IDOC 接收操作的元数据。 调用此 RFC 需要 SAP 系统中的特定用户权限。 若要生成元数据,如果已使用无权调用 IDOCTYPE_READ_COMPLETE RFC 的凭据连接到 SAP 系统,SAP 适配器会出错。

解决方案

使用用于适配器的相同凭据登录到 SAP GUI。 导航到事务 SE37,并输入要执行的 RFC 名称为 IDOCTYPE_READ_COMPLETE。

对于输入参数PI_IDOCTYP和PI_CIMTYP,请输入与自定义 IDoc 对应的值。 对于参数PI_VERSION和PI_RELEASE,请输入与在适配器元数据 UI 中选择的值相同。 然后按 F8 执行。

应获得与适配器接收的内容相同的异常,并提供有关此问题的详细信息。

如果仍无法解决问题,请为 ReceiveIdoc 操作生成架构,而不是为 Receive 操作生成架构。 在这种情况下,SAP 适配器不使用IDOCTYPE_READ_COMPLETE,也不会引发任何错误。

发送或接收具有未释放段的 IDOC 时出错

问题

SAP 适配器在发送使用 Send 操作的 IDOC 或接收使用 Receive 操作的未释放段的 IDOC 时,会出现 XmlReaderParsingException。

原因

IDOC 由段构成。 生成元数据时,SAP 适配器将检索 SAP 系统中存在的所有已发布段。 但是,当适配器客户端使用元数据执行诸如接收 IDOC 之类的操作时,SAP 适配器会抛出 XmlReaderParsingException。 之所以发生这种情况,是因为收到 IDOC 时,SAP 系统可能也发送了一些未发布的段,而适配器未为其生成元数据。

解决方案

执行以下任一操作:

  • 通过为未发布的段应用适当的修补程序来升级 SAP 系统。

  • 使用 SendIdocReceiveIdoc 分别用于发送和接收 IDOC。 有关这些操作的详细信息,请参阅 SAP 中的 IDOC 操作

在通过 SAP FilePort 收取平面文件 IDOC 时向 SAP 发送出错

问题

如果尝试将平面文件 IDOC(使用 Send 操作)发送到使用 SAP FilePort 生成的 SAP 系统,BizTalk 业务流程中的平面文件分析程序无法将平面文件转换为 XML 格式,因此 IDOC Send 操作失败。

原因

当 SAP 系统使用 FilePort 生成 IDOC 时,它会剪裁段末尾的所有空白。 但是,平面文件分析程序希望段中最后一个字段的数据能够成功将平面文件转换为 XML。 由于段中不存在空格,平面文件分析器无法将平面文件解析为 XML。

解决方案

对于通过 SAP FilePort 生成的此类平面文件 IDOC,请改用 SendIdoc 操作。 有关此操作的详细信息,请参阅 SAP 中的 IDOC 操作

如果 EnableBizTalkCompatibilityMode 属性设置为 true,则从 SAP 接收 IDOC 时出错

问题

接收 IDOC 时遇到以下异常,其绑定属性 EnableBizTalkCompatibilityMode 设置为 true:

System.Exception: Loading property information list by namespace failed or property not found in the list. Verify that the schema is deployed properly.

原因

如果绑定属性 EnableBizTalkCompatibilityMode 设置为 true,则必须将 SAP 适配器的 BizTalk 属性架构 DLL 添加为 BizTalk 应用程序中的资源,即部署项目的应用程序。

解决方案

SAP 适配器的 BizTalk 属性架构的名称 Microsoft.Adapters.SAP.BiztalkPropertySchema.dll。 这由安装驱动器>:\ Program Files\Microsoft BizTalk Adapter Pack\bin 下的 <BizTalk 适配器包安装。 执行以下任务,将此程序集添加为 BizTalk 应用程序中的资源。

在 BizTalk 应用程序中将程序集添加为资源

  1. 启动 BizTalk Server 管理控制台。

  2. 在控制台树中,依次展开 BizTalk 组应用程序以及要向其添加 BizTalk 程序集的应用程序。

  3. 展开“应用程序”并选择要添加 BizTalk 程序集的应用程序。

  4. 右键单击 “资源”,指向“ 添加”,然后单击 “BizTalk 程序集”。

  5. 单击“ 添加”,导航到包含 BizTalk 程序集文件的文件夹,选择 BizTalk 程序集文件,然后单击“ 打开”。

  6. “选项”中,指定用于将 BizTalk 程序集安装到 GAC 的选项,然后单击“ 确定”。

接收来自 SAP 系统的 IDOC 时发生验证错误。

问题

从 SAP 系统收到的 IDOC 无法通过验证,并出现类似于以下内容的错误:

There was a failure executing the receive pipeline: "Microsoft.BizTalk.DefaultPipelines.XMLReceive, Microsoft.BizTalk.DefaultPipelines, Version=3.0.1.0, Culture=neutral, PublicKeyToken=<token>"
Source: "Pipeline " Receive Port: "ReceiveIdoc" URI: "<connection uri>"
Reason: The document failed to validate because of the following error:
"The 'http://Microsoft.LobServices.Sap/2007/03/Types/Idoc/3/CREMAS03//620:TAXBS' element has an invalid value according to its data type."

原因

为接收 IDOC 而生成的元数据包含作为接收作一部分的特定列可以接收的允许值。 这些值在生成的元数据中作为枚举公开。 但是,当实际接收 IDOC 时,收到的值可能不同于枚举值。 因此,在验证这些值时接收操作失败。 例如,在上述错误消息中,TAXBS 列的验证失败。

解决方案

必须在架构(对于 BizTalk 项目)或客户端代理(对于使用 WCF 服务模型的 .NET 项目)中手动编辑枚举,以包含从 SAP 系统接收的值。

平面文件 IDOC 在转换为 XML 前后并不相同

问题

如果使用平面文件分析器使用架构将平面文件 IDOC 转换为 XML,然后使用架构通过管道将 XML 转换回平面文件 IDOC,则两个平面文件 IDOC 并不相同。

原因

从平面文件 IDOC 生成 XML 时,平面文件分析器不会生成具有空值的 XML 节点。 当此 XML 转换回平面文件时,XML 中缺少的节点不会反映在平面文件 IDOC 中。 因此平面文件形式的IDOCs并不相同。

解决方案

在用于将平面文件转换为 XML 的架构中,在“发送”或“接收”节点定义中,执行以下作:

  1. suppress_empty_nodes 属性设置为 false ,并将 generate_empty_nodes 属性设置为 true。 默认情况下,suppress_empty_nodes属性设置为 true,generate_empty_nodes属性设置为 false,因此所有空节点都不会反映在 XML 中。

  2. 平面文件格式可能包含末尾的额外回车符号。 可以将suppress_trailing_delimiters属性设置为“是”以避免此额外的回车。 如果在 Visual Studio 中打开架构,该属性也公开为 “禁止尾随分隔符 ”属性。

使用使用绑定文件创建的物理端口时出错

问题

使用适配器服务加载项为 SAP 系统上的特定操作生成架构后,加载项还会创建端口绑定文件。 可以使用 BizTalk Server 管理控制台导入此绑定文件,以在 BizTalk Server 中创建物理端口。 但是,使用此类端口将消息发送到 SAP 系统时,适配器无法理解在端口上指定的作,并给出类似于以下内容的错误:

Microsoft.ServiceModel.Channels.Common.UnsupportedOperationException: Incorrect Action
<BtsActionMapping xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Operation Name="<op_name>" Action="<action>" />
</BtsActionMapping>. Correct the specified Action, or refer to the documentation on the allowed formats for the Actions.

原因

在 BizTalk 业务流程中创建逻辑端口时,您可以为这些端口上的操作指定特定名称,或者只需使用默认名称(如 Operation_1、Operation_2 等)。然而,在由适配器服务外接程序生成的绑定文件中,操作名称与您生成元数据的操作名称相同。 例如,如果为RFC_CUSTOMER_GET生成元数据,动作将设置为以下内容:

<Operation Name="RFC_CUSTOMER_GET" Action="http://Microsoft.LobServices.Sap/2007/03/Rfc/RFC_CUSTOMER_GET" />

当导入绑定文件时,将相同的操作设置在物理端口上。 因此,逻辑端口(Operation_1、Operation_2等)上的作名称与物理端口的作中指定的作名称不匹配,从而导致错误。

解决方案

请确保逻辑端口中的操作名称与物理端口中作为操作一部分指定的操作名称相同。 执行下列操作之一:

  • 将 BizTalk 业务流程中逻辑端口中的操作名称从 Operation_1 等更改为用于生成元数据的操作,例如 RFC_CUSTOMER_GET。

  • 将物理端口上的操作名称更改为逻辑端口中的操作名称。 例如,您可以更改物理端口中的操作,如下所示:

    <Operation Name="Operation_1" Action="http://Microsoft.LobServices.Sap/2007/03/Rfc/RFC_CUSTOMER_GET" />
    

在 SAP 上运行的操作的响应消息不包含任何表参数。

原因

如果你使用 SAP 适配器在 SAP 系统上执行操作,该操作返回大量表格且每个表格包含大量记录,这将导致作为 SAP 系统响应消息的一部分返回一个大型数据集。 因此,默认情况下,SAP 适配器不会返回任何表参数作为响应消息的一部分。

解决方案

可以请求希望 SAP 适配器作为响应的一部分返回的表。 为此,可以提供空表参数作为发送到 SAP 系统的请求消息的一部分。 例如,<table_parameter_name />

适配器客户端未从 SAP 接收响应

问题

在 BizTalk Server 中使用适配器时,如果 WCF 自定义发送端口上的凭据不正确,则不会处理请求消息。 指定正确的凭据后,消息将发送到 SAP 系统并收到响应。 但是,响应消息对输出端口不可用。

解决方案

重启 BizTalk 主机实例。

从 SAP 服务器接收入站消息时的连接故障

问题

仅当使用 SAP 适配器的 WCF-Custom 接收端口从 SAP 服务器接收入站消息时,才会收到以下错误。

The Messaging Engine failed to add a receive ___location "<location_name>" with URL "<connection URI>" to the adapter "WCF-Custom".
Reason: "Microsoft.Adapters.SAP.RFCException: Details: ErrorCode=RFC_OK. ErrorGroup=RFC_ERROR_COMMUNICATION. SapErrorMessage=Connect to SAP gateway failed
Connect_PM  TPNAME=<name>, GWHOST=<host>, GWSERV=<server>

但是,你已成功使用 WCF-Custom 发送端口将消息发送到 SAP 系统。

解决方案

在运行适配器客户端的同一台计算机上安装 SAP GUI,然后再次尝试接收入站消息。 有关如何安装 SAP GUI 的详细信息,请参阅 SAP 文档。

BizTalk 项目中的 RootNode TypeName 错误

问题

在 Visual Studio 中的一个 BizTalk 项目中,如果从"使用适配器服务"附加组件生成的架构包含 RootNode TypeName 属性的无效字符或保留字,那么在编译项目时会发生以下错误:

Node <node reference> - Specify a valid .NET type name for this root node.
The current .NET type name of this root node is invalid (it is a reserved BizTalk Keyword or is an invalid C# identifier).

解决方案

  1. 右键单击错误中引用的 rood 节点,然后选择“ 属性”。

  2. 对于 RootNode TypeName 属性,请删除任何非法字符或保留字,例如点(.)。

在 Visual Studio 中使用适配器时绑定警告无效

问题

使用适配器在 Visual Studio 中创建应用程序并打开适配器生成的配置文件(app.config),会看到如下所示的警告:

The element 'bindings' has invalid child element 'sapBinding'. List of possible elements expected: 'basicHttpBinding, customBinding, ...

原因

出现此警告是因为 SAP 适配器绑定 sapBinding不是 Windows Communication Foundation (WCF)附带的标准绑定。

解决方案

可以放心地忽略此警告。

BizTalk Server 中的 XLANG 异常

问题

BizTalk Server 会引发 XLANG 异常或提示应用程序无法定位文档规范,因为多个架构与消息类型匹配。

原因

发生此情况的原因有以下任一:

  • 您在 BizTalk Server 项目中生成了多于一个通用操作(如 SendIdoc 和 ReceiveIdoc)的架构,将其部署到 BizTalk Server 应用程序,然后运行该应用程序以在 SAP 系统上执行相应的操作。 由于架构很常见,因此在 BizTalk Server 应用程序中部署的架构之间存在冲突。

  • 对于多个项目,你已为每个 BizTalk Server 项目生成一个通用作架构,并将每个项目部署到同一主机上的单独 BizTalk Server 应用程序,然后运行应用程序或应用程序以在 SAP 系统上执行相应的作。 由于可以在 BizTalk Server 中的应用程序中访问架构和程序集,因此在各种 BizTalk Server 应用程序和程序集下部署的常见架构之间存在冲突。

    解决方案

    对 BizTalk Server 应用程序使用单个通用操作架构文件。 如果需要在同一主机上的多个 BizTalk Server 应用程序中使用泛型作架构,请创建包含单个泛型作架构的应用程序,然后使用 BizTalk Server 中所有其他应用程序的泛型作架构。

另请参阅

SAP 适配器疑难解答