排查 SAP 适配器的操作问题

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

启用跟踪

有关 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 参数来解决此问题:

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

  • 将以下内容添加到应用程序的 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 时出错

问题

BizTalk Server指定连接 URI 以连接到 SAP 系统时出现以下错误。

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 系统的最大连接数。 使用以下详细信息创建环境变量:

生成或检索 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,并输入要作为IDOCTYPE_READ_COMPLETE执行的 RFC 的名称。

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

应收到与适配器接收的相同异常,其中包含有关此问题的详细信息。

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

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

问题

SAP 适配器在使用发送操作) 发送 IDOC (或使用具有未发布的段的接收操作) 接收 IDOC (时,为 XmlReaderParsingException 提供 XmlReaderParsingException。

原因

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

解决方法

执行以下任一操作:

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

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

将平面文件 IDOC 发送到使用 SAP FilePort 接收的 SAP 时出错

问题

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

原因

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

解决方法

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

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

问题

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

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。 这由 BizTalk 适配器包安装程序安装在安装驱动器>:\ Program Files\Microsoft BizTalk Adapter Pack\bin 下<。 执行以下任务,将此程序集添加为 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”列的验证失败。

解决方法

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

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

问题

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

原因

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

解决方法

在用于将平面文件转换为 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 属性,请删除任何非法字符或保留字,例如 dot (.) 。

在 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 适配器问题